Existe alguma maneira no Selenium 1.x ou 2.x para rolar a janela do navegador para que um elemento específico identificado por um XPath esteja à vista do navegador? Existe um método de foco no Selenium, mas parece não rolar fisicamente a exibição no FireFox. Alguém tem alguma sugestão sobre como fazer isso?
A razão pela qual eu preciso disso é que estou testando o clique de um elemento na página. Infelizmente, o evento parece não funcionar, a menos que o elemento esteja visível. Eu não tenho controle do código que é acionado quando o elemento é clicado, por isso não posso depurar ou fazer modificações nele; portanto, a solução mais fácil é rolar o item para exibição.
selenium
scroll
automated-tests
Dan na Demand
fonte
fonte
Respostas:
Já tentei muitas coisas com relação à rolagem, mas o código abaixo forneceu melhores resultados.
Isso rolará até que o elemento esteja em exibição:
fonte
position: fixed
na sua página e está obscurecendo o elemento que o Selenium deseja clicar. Muitas vezes, esses elementos fixos ficam na parte inferior, portanto, a configuração oscrollIntoView(true)
move muito bem para o topo da viewport.true
parascrollIntoView
se o objeto para o qual você está rolando está abaixo de onde você está atualmente,false
se o objeto para o qual está rolando está acima de onde você está atualmente. Eu tive dificuldade para descobrir isso.Você pode usar a
org.openqa.selenium.interactions.Actions
classe para ir para um elemento.Java:
Pitão:
fonte
Você pode tentar isso.
fonte
js.ExecuteScript("arguments[0].scrollIntoView(true);" + "window.scrollBy(0,-100);", e);
para o IE e Firefox ejs.ExecuteScript("arguments[0].scrollIntoViewIfNeeded(true);", e);
para o Chrome. Simples.((JavascriptExecutor) driver).executeScript("javascript:window.scrollBy(0,250)");
Isso funcionou no Chrome. E a única solução que realmente funcionou para mim. Na mesma situação que o primeiro comentarista, eu tinha um elemento fixo na parte inferior que continuava obscurecendo o elemento que eu precisava clicar.Se você deseja rolar na janela do Firefox usando o driver da web Selenium, uma das maneiras é usar JavaScript no código Java. O código JavaScript para rolar para baixo (na parte inferior da página da web) é o seguinte:
fonte
Segmentar qualquer elemento e enviar as teclas para baixo (ou para cima / esquerda / direita) também parece funcionar. Sei que isso é um pouco complicado, mas também não gosto da idéia de usar JavaScript para resolver o problema de rolagem.
Por exemplo:
fonte
var elem = driver.FindElement(By.Id("element_id")); elem.SendKeys(Keys.PageDown);
Para mais exemplos, clique aqui . Tudo em russo, mas o código Java é intercultural :)
fonte
No Selenium, precisamos da ajuda de um executor JavaScript para rolar para um elemento ou rolar a página:
Na declaração acima,
element
está o elemento exato em que precisamos rolar. Eu tentei o código acima e funcionou para mim.Tenho um post e um vídeo completos sobre isso:
http://learn-automation.com/how-to-scroll-into-view-in-selenium-webdriver/
fonte
Você pode usar este trecho de código para rolar:
C #
Aí está
fonte
Isso funcionou para mim:
fonte
O Selenium 2 tenta rolar para o elemento e depois clicar nele. Isso ocorre porque o Selenium 2 não interage com um elemento, a menos que ele pense que é visível.
A rolagem para o elemento acontece implicitamente, então você só precisa encontrar o item e trabalhar com ele.
fonte
WebElement.click()
o elemento deve estar visível para clicar nele. Não rolará em seu nome.Use o driver para enviar chaves como a tecla pagedownou downarrowpara exibir o elemento. Sei que é uma solução muito simples e pode não ser aplicável em todos os casos.
fonte
element
na página visível e enviar o PageDownelement.SendKeys(Keys.PageDown);
funcionou para mim.Pela minha experiência, o Selenium Webdriver não rola automaticamente para um elemento ao clicar quando há mais de uma seção rolável na página (o que é bastante comum).
Estou usando Ruby e, para meu AUT, tive que aplicar um patch ao método de clique da seguinte maneira;
O método 'location_once_scrolled_into_view' é um método existente na classe WebElement.
Aprecio que você pode não estar usando Ruby, mas isso deve lhe dar algumas idéias.
fonte
module Capybara :: module Node
e precisava ligar emnative.location_once_scrolled_into_view
vez de apenaslocation_once_scrolled_into_view
. Também salvei::Selenium::WebDriver::Error::UnknownError
, que é o que estou recebendo frequentemente no Firefox 44.0.2. Mas acho que essa solução não é flexível o suficiente e, finalmente, faço as<Element>.native.location_once_scrolled_into_view
chamadas no próprio teste de aceitação, seguido imediatamentepage.execute_script('window.scrollByPages(-1)')
quando necessário.Element#scroll_into_view
que delega para o Seleniumlocation_once_scrolled_into_view
. Mas ambos não fazem nada diferente do comportamento padrão do Seleniums, de modo que os elementos de transbordamento ainda podem obstruir o que quer que tentemos clicar.O script Ruby para rolar um elemento para exibição é o seguinte.
fonte
Às vezes, também enfrentava o problema de rolar com o Selenium. Então, eu usei o javaScriptExecuter para conseguir isso.
Para rolar para baixo:
Ou também
Para rolar para cima:
Ou,
fonte
Se você acha que outras respostas foram muito hacky, essa também é, mas não há injeção de JavaScript envolvida.
Quando o botão está fora da tela, ele quebra e rola até ele; tente novamente ... ¯ \ _ (ツ) _ / ¯
fonte
Esta é uma solução repetida com JavaScript, mas com um elemento em espera adicionado.
Caso contrário,
ElementNotVisibleException
poderá aparecer se alguma ação no elemento estiver sendo realizada.fonte
Eu usei esse caminho para rolar o elemento e clique em:
fonte
scrollIntoView(false)
funcionou, masscrollIntoView(true)
não funcionou . Qualquer um pode funcionar , depende do seu cenário.fonte
Convém visitar a página Elementos da Web de rolagem e a página da Web - Selenium WebDriver usando Javascript :
fonte
Na maior parte da situação para rolar esse código funcionará.
fonte
JAVA
Tente rolar para o elemento utilizar
x y
position e useJavascriptExecutor
com este argumento:"window.scrollBy(x, y)"
.Após a importação:
Primeiro você precisa obter
x y
o elemento de localização.fonte
Não tenho certeza se a pergunta ainda é relevante, mas depois de me referir à documentação scrollIntoView em https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView .
A solução mais fácil seria
Isso rola o elemento para o centro da página.
fonte
O comportamento padrão do Selenium é fazer a rolagem para que o elemento mal seja visualizado na parte superior da janela de visualização. Além disso, nem todos os navegadores têm exatamente o mesmo comportamento. Isso é muito insatisfatório. Se você gravar vídeos dos testes do seu navegador, como eu, o que você deseja é que o elemento role para exibição e seja centralizado verticalmente .
Aqui está minha solução para Java:
E então, para rolar, você chama assim:
fonte
Aqui está como eu faço isso com o PHP webDriver for Selenium. Funciona para servidor independente Selenium 2.39.0 + https://github.com/Element-34/php-webdriver + Firefox 25.0
Nota: Eu uso uma versão personalizada do element34 PHP-webdriver. Mas não há nenhuma mudança no núcleo. Eu apenas uso meu "bem-estar" em vez de "elemento". Mas isso não influencia o caso em questão. O autor do driver diz "permitir que quase todas as chamadas de API sejam uma transformação direta do que é definido no próprio protocolo WebDriver". Portanto, você não deve ter problemas com outras linguagens de programação.
Apenas clicar não funcionará na minha configuração. Ele fará uma rolagem em vez de clicar, então tive que clicar duas vezes sem chamar "location_in_view ()".
Nota: Este método funciona para elementos que podem ser visualizados, como uma entrada do botão de tipo.
Dê uma olhada em: http://code.google.com/p/selenium/wiki/JsonWireProtocol#/session/:sessionId/element/:id/location
A descrição para JsonWireProtocol # sugere o uso de location + moveto, porque location_in_view é um método interno.
fonte
Algo que funcionou para mim foi usar o método Browser.MoveMouseToElement em um elemento na parte inferior da janela do navegador. Milagrosamente, ele funcionou no Internet Explorer, Firefox e Chrome.
Eu escolhi isso sobre a técnica de injeção de JavaScript apenas porque parecia menos invasiva.
fonte
Venho testando com componentes do ADF e você precisa ter um comando separado para rolar se o carregamento lento for usado. Se o objeto não estiver carregado e você tentar encontrá-lo usando o Selenium, o Selenium lançará uma exceção de elemento não encontrado.
fonte
Se nada funcionar, tente isso antes de clicar em:
fonte
Em Java, podemos rolar usando JavaScript, como no código a seguir:
Você pode atribuir um valor desejado à variável "elm.scrollTop".
fonte
Uma solução é:
fonte
Este código está funcionando para mim:
fonte