python with Rolando para o elemento usando o webdriver?




verify selenium python (4)

Eu ainda estou aprendendo e em resposta a uma das minhas perguntas: here , foi-me dito que isso poderia acontecer porque o elemento em questão não está à vista.

Eu olhei através da documentação e SO, aqui foi a resposta mais relevante: here

Você pode usar a classe "org.openqa.selenium.interactions.Actions" para mover para um elemento:

WebElement element = driver.findElement(By.id("my-id"));
Actions actions = new Actions(driver);
actions.moveToElement(element);
## actions.click();
actions.perform();

Quando tento usar o acima para rolar para o elemento: Ele diz WebElement não definido.

Eu acho que isso é porque eu não importei o módulo relevante. Alguém pode indicar o que devo importar?

Edit: Como apontado por alecxe, este era o código java.

Mas, entretanto, logo depois de tentar descobrir isso há algum tempo. Eu descobri o método de importação para WebElement:

from selenium.webdriver.remote.webelement import WebElement

Pode ajudar alguém como eu.

O como é também uma boa lição, IMO:

Fui para: Documentation

class selenium.webdriver.remote.webelement.WebElement(parent, id_, w3c=False)

Precisa ser separado no formulário de comando mencionado acima.


Você está tentando executar o código Java com o Python. Em Python / Selenium, as org.openqa.selenium.interactions.Actions são refletidas na classe ActionChains :

from selenium.webdriver.common.action_chains import ActionChains

element = driver.find_element_by_id("my-id")

actions = ActionChains(driver)
actions.move_to_element(element).perform()

Ou você também pode "rolar para a tela" via scrollIntoView() :

driver.execute_script("arguments[0].scrollIntoView();", element)

Se você está interessado nas diferenças:


Não é uma resposta direta à pergunta (não é sobre Actions ), mas também permite que você role facilmente para o elemento requerido:

element = driver.find_element_by_id('some_id')
element.location_once_scrolled_into_view

Isso realmente pretende retornar coordenadas ( x , y ) do elemento na página, mas também rolar para baixo à direita para o elemento de destino


Você pode rolar para o elemento usando javascript através do método execute_javascript . Por exemplo, aqui está como eu faço isso usando o SeleniumLibrary no Robot Framework:

web_element = self.selib.find_element(locator)
self.selib.execute_javascript(
    "ARGUMENTS",
    web_element,
    "JAVASCRIPT",
    'arguments[0].scrollIntoView({behavior: "instant", block: "start", inline: "start"});'
)

Há outra opção para rolar a página para o elemento obrigatório se o elemento tiver o atributo "id"

Se você quiser navegar para a página e rolar para o elemento com @id , isso pode ser feito automaticamente adicionando #element_id ao URL ...

Exemplo

Digamos que precisamos navegar para a documentação do Selenium Waits e rolar a página para a seção "Espera Implícita". Nós podemos fazer

driver.get('https://selenium-python.readthedocs.io/waits.html')

e adicione código para rolagem ... OU use

driver.get('https://selenium-python.readthedocs.io/waits.html#implicit-waits')

para navegar para a página E rolar a página automaticamente para o elemento com id="implicit-waits" ( <div class="section" id="implicit-waits">...</div> )





selenium-webdriver