Прокрутка элемента в поле зрения с помощью Selenium

Есть ли способ в Selenium 1.x или 2.x прокручивать окно браузера, чтобы конкретный элемент, идентифицированный XPath, был виден браузеру? В Selenium есть метод focus, но он, похоже, не прокручивает представление в FireFox физически. Есть ли у кого-нибудь предложения, как это сделать?

Причина, по которой мне это нужно, заключается в том, что я тестирую щелчок элемента на странице. К сожалению, событие не работает, если элемент не виден. У меня нет контроля над кодом, который запускается при щелчке по элементу, поэтому я не могу отлаживать или вносить в него изменения, поэтому самым простым решением является прокрутка элемента в поле зрения.


person Dan at Demand    schedule 03.08.2010    source источник
comment
Вы можете попробовать этот хакерский , если у вас больше ничего не работает: stackoverflow.com/a/53771434/7093031 < / а>   -  person Y-B Cause    schedule 17.12.2018


Ответы (35)


Пробовали много вещей в отношении прокрутки, но приведенный ниже код дал лучшие результаты.

Это будет прокручиваться, пока элемент не появится в поле зрения:

WebElement element = driver.findElement(By.id("id_of_element"));
((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", element);
Thread.sleep(500); 

//do anything you want with the element
person Amith    schedule 10.12.2013
comment
Это отличное решение, когда на вашей странице может быть элемент с position: fixed, который скрывает элемент, по которому Selenium хочет щелкнуть. Довольно часто эти фиксированные элементы располагаются внизу, поэтому установка scrollIntoView(true) хорошо перемещает их в верхнюю часть области просмотра. - person Mandible79; 02.10.2014
comment
Основанный на новейшей версии selenium (2.53), теперь это отличное вспомогательное решение. Selenium не всегда прокручивает элемент в поле зрения, так что это определенно пригодится. - person Zoidberg; 12.04.2016
comment
Передайте true в scrollIntoView, если объект, к которому вы прокручиваете, находится ниже того места, где вы сейчас находитесь, false, если объект, к которому вы прокручиваете, находится выше того места, где вы сейчас находитесь. Мне было трудно понять это. - person Big Money; 28.07.2016
comment
Спасибо за этот ответ. Я немного изменил его для наших нужд, потому что у нас есть фиксированный верхний колонтитул + фиксированный нижний колонтитул. Итак, я просто прокручиваю на 100 пикселей вверх в качестве отступа. Не самое чистое решение, но оно должно работать для всех наших нужд. ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true); window.scrollBy(0,-100);", element); element.click()`; - person Patrick Winkelmayer; 31.01.2017
comment
У меня не получилось: - | Вместо этого использовался stackoverflow.com/a/23902068/661414. - person Leukipp; 21.08.2018
comment
Зачем тебе нить спать? executeScript должен быть синхронным - person riccardo.tasso; 04.09.2018
comment
Однострочная версия C # WebDriver.ExecuteJavaScript (arguments [0] .scrollIntoView (true) ;, driver.findElement (By.id (id_of_element))); - person Raghu; 12.05.2019
comment
@BigMoney то, что вы написали, неверно. См. документацию. true выравнивает элемент по верхнему краю экрана, а false выравнивает элемент по нижнему краю экрана. - person Jonathan Benn; 06.06.2019
comment
@ riccardo.tasso, возможно, был реализован спящий режим, чтобы иметь дело с неизвестным целевым приложением. Если у него есть динамическая прокрутка или одностраничное приложение, которое загружает следующий бит страницы после прокрутки, среди других возможностей. Судя по опыту, Selenium часто нарушал работу сайта моей компании, потому что автоматическое действие происходило быстрее, чем мог завершить Javascript, и, таким образом, передавал неполную модель данных. В некоторых местах это может считаться ошибкой, но мне сказали, что ни один человек не сможет вызвать такой сценарий, так что это не настоящая ошибка. Такова жизнь. - person Solonotix; 21.11.2019
comment
Истина или Ложь, поскольку первый аргумент может быть опущен, это необязательно. У меня работает без всяких аргументов. - person Ron HD; 06.08.2020

Вы можете использовать класс org.openqa.selenium.interactions.Actions для перехода к элементу.

Джава:

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

Python:

from selenium.webdriver.common.action_chains import ActionChains
ActionChains(driver).move_to_element(driver.sl.find_element_by_id('my-id')).perform()
person sascha    schedule 20.10.2014
comment
Будет ли это работать, если WebElement не находится в порту просмотра? - person virusrocks; 04.11.2015
comment
При этом указатель мыши переместится только в середину элемента в соответствии с документы - person Dominik Mohr; 25.11.2015
comment
@Dominik: Как Selenium переместит мышь к элементу за пределами экрана? ОЧЕВИДНО, он должен сначала прокрутить элемент в поле зрения, а затем переместить на него мышь. Я это тестировал. Этот код работает в Firefox Webdriver 2.48, но есть ошибка: когда у вас есть iframe на странице, прокрутка в iframe работает некорректно, в то время как element.LocationOnScreenOnceScrolledIntoView прокручивается правильно. (Хотя в документации сказано, что эта команда возвращает только местоположение, она также прокручивается!) - person Elmue; 05.12.2015
comment
Документы по адресу seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/ теперь четко указано. Перемещает мышь к середине элемента. Элемент прокручивается, и его местоположение вычисляется с помощью getBoundingClientRect. - person George Pantazes; 09.09.2017
comment
Могу ли я отозвать свой голос за? Вопрос заключается в том, чтобы прокрутить элемент в поле зрения, а не перемещать мышь к элементу, что предлагает этот ответ. - person Jorn; 21.09.2017
comment
Приведенный выше код является официальным способом, которым Java Selenium хочет, чтобы вы выполняли прокрутку элемента в окне просмотра, однако после многих попыток реализация JS показалась мне более надежной. В частности, этот метод. - person Kenji Miwa; 26.09.2017
comment
Его эквивалент в Python: from selenium.webdriver.common.action_chains import ActionChains #... ActionChains(driver).move_to_element(element).perform() - person phyatt; 20.02.2018
comment
У меня не получилось: - | Вместо этого использовался stackoverflow.com/a/23902068/661414. - person Leukipp; 21.08.2018
comment
@Elmue Благодаря вашему комментарию, я решил эту проблему, сначала прокрутив вниз до iframe, прежде чем выполнять driver.switch_to.frame(). - person Leonard; 20.01.2019
comment
Раньше я использовал LocationOnScreenOnceScrolledIntoView, который больше НЕ прокручивается с новыми драйверами Gecko. Они его сломали. С другой стороны, actions.moveToElement () не работает с Safari на iOS: действия не поддерживаются. Кроме того, moveToElement () ничего не делает, если верх элемента уже виден. Но если у вас большой элемент и виден только верх, эта команда совершенно бесполезна. Единственный правильный способ прокрутки элемента для автоматизации - это выполнение JavaScript с аргументами [0] .scrollIntoView (true); и позвольте браузеру прокрутить его до верхней части экрана. - person Elmue; 03.08.2019
comment
Это не прокручивает окно, а только перемещает мышь к элементу, который не отвечает на вопрос - person TK Tang; 25.09.2019
comment
Я обнаружил, что в Chrome без головы все еще нужно подождать, пока элемент станет видимым, прежде чем щелкнуть по нему этим WebDriverWait(self.driver, 10).until(expected_conditions.visibility_of_element_located((By.ID, 'my-id'))) - person David R.; 20.03.2020

JavascriptExecutor js = (JavascriptExecutor) driver;
        js.executeScript("javascript:window.scrollBy(250,350)");

Вы можете попробовать это.

person Mayur    schedule 22.03.2012
comment
Спасибо. Мне нужно было использовать этот метод в случае, когда автопрокрутка Selenium заставляла другой элемент скрывать элемент, который мне нужно было щелкнуть. Я смог прокрутить произвольную величину, чтобы сделать элемент видимым в области просмотра, не закрывая его. - person Daniel Richnak; 28.08.2012
comment
Это будет работать только в FIrefox, Chrome и IE не поддерживают этот метод. - person virusrocks; 11.07.2015
comment
Вот почему вы используете js.ExecuteScript("arguments[0].scrollIntoView(true);" + "window.scrollBy(0,-100);", e); для IE и Firefox и js.ExecuteScript("arguments[0].scrollIntoViewIfNeeded(true);", e); для Chrome. Простой. - person IamBatman; 09.10.2017
comment
((JavascriptExecutor) driver).executeScript("javascript:window.scrollBy(0,250)"); Это работало в Chrome. И единственное решение, которое действительно сработало для меня. Та же ситуация, что и у первого комментатора, у меня был фиксированный элемент внизу, который продолжал скрывать элемент, который мне нужно было щелкнуть. - person silver; 09.12.2019
comment
И это не сработает, если у вас есть прокручиваемый div: / - person akostadinov; 19.05.2020

Если вы хотите прокручивать окно Firefox с помощью веб-драйвера Selenium, одним из способов является использование JavaScript в коде Java. Код JavaScript для прокрутки вниз (вниз веб-страницы) выглядит следующим образом:

JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("window.scrollTo(0, Math.max(document.documentElement.scrollHeight, document.body.scrollHeight, document.documentElement.clientHeight));");
person Ankit Pandey    schedule 30.08.2012

Таргетинг на любой элемент и отправка клавиш вниз (или вверх / влево / вправо ), похоже, тоже работает. Я знаю, что это что-то вроде взлома, но мне тоже не очень нравится использовать JavaScript для решения проблемы прокрутки.

Например:

WebElement.sendKeys(Keys.DOWN);
person DevDave    schedule 17.05.2013
comment
Это не меньшая хитрость, чем использование js, и это действительно самая простая вещь. Я обнаружил, что это в первую очередь проблема с IE, когда щелчок пытается прокрутить элемент в поле зрения, но не удается. Такое же элегантное решение с использованием {PGUP}, если оно сделано с правильным сценарием try / catch / loop. - person jibbs; 16.12.2015
comment
Ты спас мне день! Спасибо - person Jesko R.; 04.03.2016
comment
В моем случае сработала страница вниз. Это хороший хак (по сравнению со всеми js-хаками). - person akostadinov; 19.05.2020
comment
Спасибо, @DevDave! Эквивалент в C #: var elem = driver.FindElement(By.Id("element_id")); elem.SendKeys(Keys.PageDown); - person Watth; 05.06.2020

В Selenium нам нужно воспользоваться помощью исполнителя JavaScript для прокрутки к элементу или прокрутки страницы:

je.executeScript("arguments[0].scrollIntoView(true);", element);

В приведенном выше утверждении element - это именно тот элемент, который нам нужно прокрутить. Я попробовал приведенный выше код, и у меня он сработал.

У меня есть полный пост и видео по этому поводу:

http://learn-automation.com/how-to-scroll-into-view-in-selenium-webdriver/

person Mukesh otwani    schedule 07.09.2016
comment
@Mukesh otwani приведенный выше код будет прокручиваться вниз, но как прокручивать вверх без использования каких-либо определенных в нем пикселей. - person khan; 12.10.2018

webElement = driver.findElement(By.xpath("bla-bla-bla"));
((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoView();", webElement);

Дополнительные примеры см. здесь. Все на русском, но код Java кросс-культурный :)

person VovecUdalec    schedule 12.09.2014
comment
Могу ли я понять, почему для этого решения стоит -1? - person josephnvu; 06.07.2015
comment
Потому что это работает только в Firefox. Ни один другой браузер не поддерживает этот метод. - person Wayne Allen; 13.02.2017
comment
Если кому-то понадобится перевод с русского вышеупомянутого документа, будем рады помочь. - person monkrus; 14.06.2019

Вы можете использовать этот фрагмент кода для прокрутки:

C #

var element = Driver.FindElement(By.Id("element-id"));
Actions actions = new Actions(Driver);
actions.MoveToElement(element).Perform();

Вот оно что

person Mohsin Awan    schedule 08.11.2016

Используйте драйвер для отправки ключей, таких как pagedown или downarrow, чтобы отобразить элемент. Я знаю, что это слишком простое решение и может быть применимо не во всех случаях.

person Ganesh S    schedule 08.07.2013
comment
Это нонсенс. Возможно, вам придется отправить десяток страниц вниз на большой странице. Это медленно и ненадежно. - person Elmue; 14.09.2015
comment
да. Я согласен. Но я сказал, что не во всех случаях - person Ganesh S; 28.12.2015
comment
Поиск известных element на просматриваемой странице и отправка PageDown element.SendKeys(Keys.PageDown); сработали для меня. - person Gokul; 04.10.2017
comment
Я бы посоветовал использовать клавишу Alt, чтобы вы не прокручивали страницу и не использовали предложение try / except (Python) для обработки ошибок, которые могут возникнуть при попытке отправить ключи некоторым элементам. - person Alex K.; 26.06.2018

Это сработало для меня:

IWebElement element = driver.FindElements(getApplicationObject(currentObjectName, currentObjectType, currentObjectUniqueId))[0];
 ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].scrollIntoView(true);", element);
person user103    schedule 27.05.2014

По моему опыту, Selenium Webdriver не выполняет автоматическую прокрутку к элементу по щелчку, когда на странице есть более одного прокручиваемого раздела (что довольно часто).

Я использую Ruby, и для моего AUT мне пришлось обезьяно исправить метод щелчка следующим образом;

class Element

      #
      # Alias the original click method to use later on
      #
      alias_method :base_click, :click

      # Override the base click method to scroll into view if the element is not visible
      # and then retry click
      #
      def click
        begin
          base_click
        rescue Selenium::WebDriver::Error::ElementNotVisibleError
          location_once_scrolled_into_view
          base_click
        end
      end

Метод location_once_scrolled_into_view - это существующий метод в классе WebElement.

Я ценю, что вы, возможно, не используете Ruby, но он должен дать вам некоторые идеи.

person Robbie Wareham    schedule 12.02.2014
comment
Я объявил это в module Capybara :: module Node, и мне нужно было вызвать native.location_once_scrolled_into_view, а не просто location_once_scrolled_into_view. Я также спас ::Selenium::WebDriver::Error::UnknownError, который я часто получаю в Firefox 44.0.2. Но я считаю это решение недостаточно гибким и в конечном итоге помещаю вызовы <Element>.native.location_once_scrolled_into_view в сам приемочный тест, за которым сразу же следует page.execute_script('window.scrollByPages(-1)') там, где это необходимо. - person Al Chou; 26.02.2016
comment
У Watir есть метод Element#scroll_into_view, который делегирует location_once_scrolled_into_view location_once_scrolled_into_view Selenium. Но оба они не отличаются от поведения Selenium по умолчанию, поэтому элементы переполнения все еще могут препятствовать тому, что мы пытаемся щелкнуть. - person akostadinov; 19.05.2020

Selenium 2 пытается прокрутить до элемента, а затем щелкнуть по нему. Это связано с тем, что Selenium 2 не будет взаимодействовать с элементом, если не считает, что он видим.

Прокрутка к элементу происходит неявно, поэтому вам просто нужно найти элемент, а затем работать с ним.

person AutomatedTester    schedule 04.08.2010
comment
Спасибо, думаю, мне придется перейти на 2.0. Я знал, что этот день придет ;-) - person Dan at Demand; 04.08.2010
comment
Как это ответ на вопрос? - person reinierpost; 14.08.2012
comment
не похоже, чтобы это сработало для меня. Я получаю ошибки "элемент не кликабельный" для элементов, которые находятся вне поля зрения - person DevDave; 17.05.2013
comment
@DevDave У меня та же проблема, за исключением того, что в моем случае селен не выполняет действие щелчка по элементу, и нет никаких исключений. Раньше у меня не было этой проблемы, и я не знаю, чем она вызвана. - person Zeinab Abbasimazar; 12.11.2013
comment
Это не сработало для меня должным образом, потому что на странице, которую я тестировал, был статический фиксированный заголовок. Мне пришлось вручную выполнить window.scrollBy (0, -100), чтобы убедиться, что он находится в поле зрения. - person Jon Tirsen; 09.09.2014
comment
Неявная прокрутка зависит от браузера. У меня есть тест элемента во всплывающем меню на полпути вниз по странице. С помощью Ruby gem selenium_webdriver 2.43 я обнаружил, что Chrome-browser 37 (и я считаю, что Internet Explorer) действительно прокручивает элемент меню и щелкает его. Но Firefox 32, похоже, вообще не прокручивается, а затем выходит из строя, элемент в настоящее время не отображается, и с ним нельзя взаимодействовать. - person skierpage; 16.09.2014
comment
Это неверный ответ. Согласно спецификации Selenium 2.0 WebElement.click() требует, чтобы элемент был видимым, чтобы по нему можно было щелкнуть. Он не будет прокручиваться от вашего имени. - person Gili; 22.11.2014
comment
Не работает для Selenium 2.44 с Chrome 39 (прокрутка вниз кажется работает, но прокрутка вверх - нет) - person Nick Baker; 09.01.2015
comment
Это не правильно. Это не работает. Это может сработать в некоторых обстоятельствах, но не в том, для чего мне это нужно. - person Dave Lawrence; 09.08.2016
comment
Ответ на этот вопрос на странице stackoverflow.com/a/26461431/489888 для меня. - person Steve Martin; 13.12.2016
comment
@Gili Согласно спецификации Selenium 2.0 - не могли бы вы дать точную ссылку? Я нашел этот w3.org/TR/ 2013 / WD-webdriver-20130117 /, и в нем говорится, что если элемент находится за пределами области просмотра (согласно спецификации [CSS21]), реализация должна сначала отобразить элемент. - person Adrian Herscu; 10.06.2019
comment
@AdrianHerscu Я больше не могу найти упоминания об этом в Selenium Javadoc, но вы должны отметить, что APi Selenium предшествует стандарту W3C, поэтому вполне возможно, что спецификация изменилась. - person Gili; 11.06.2019

Сценарий Ruby для прокрутки элемента в поле зрения показан ниже.

$driver.execute_script("arguments[0].scrollIntoView(true);", element)
sleep(3)
element.click
person Satheesh kumar    schedule 30.06.2016

Иногда я также сталкивался с проблемой прокрутки с помощью Selenium. Поэтому для этого я использовал javaScriptExecuter.

Для прокрутки вниз:

WebDriver driver = new ChromeDriver();
JavascriptExecutor js = (JavascriptExecutor)driver;
js.executeScript("window.scrollBy(0, 250)", "");

Или также

js.executeScript("scroll(0, 250);");

Для прокрутки вверх:

js.executeScript("window.scrollBy(0,-250)", "");

Or,

js.executeScript("scroll(0, -250);");
person Anuraj R    schedule 16.10.2016

Если вы думаете, что другие ответы были слишком хакерскими, этот тоже, но здесь нет инъекции JavaScript.

Когда кнопка находится за пределами экрана, она прерывается и прокручивается до нее, поэтому повторите попытку ... ¯ \ _ (ツ) _ / ¯

try
{
    element.Click();
}
catch {
    element.Click();
}
person vicentedealencar    schedule 29.07.2016

Это повторяющееся решение с JavaScript, но с добавленным элементом ожидания.

В противном случае ElementNotVisibleException может появиться, если над элементом выполняется какое-то действие.

this.executeJavaScriptFunction("arguments[0].scrollIntoView(true);", elementToBeViewable);
WebDriverWait wait = new WebDriverWait(getDriver(), 5);
wait.until(ExpectedConditions.visibilityOf(elementToBeViewable));
person Lukasz    schedule 25.01.2017
comment
?? <- что это значит? - person Choi; 14.06.2019

Я использовал этот способ для прокрутки элемента и щелкнул:

List<WebElement> image = state.getDriver().findElements(By.xpath("//*[contains(@src,'image/plus_btn.jpg')]"));

for (WebElement clickimg : image)
{
  ((JavascriptExecutor) state.getDriver()).executeScript("arguments[0].scrollIntoView(false);", clickimg);
  clickimg.click();
}
person Bibek    schedule 10.04.2014
comment
В моем случае scrollIntoView(false) работал, а scrollIntoView(true) - нет. Любой из них может работать, это зависит от вашего сценария. - person rsenna; 16.09.2014
comment
В моем случае все наоборот - true работает, false не работает, но только до щелчка. Он правильно прокручивается для false, и это то, что я предпочитаю, но по какой-то причине Selenium все еще не видит его для щелчка. Использование true прокрутки слишком высоко, но, по крайней мере, это работает. - person Bill Hileman; 07.03.2017
comment
Пользовательские клавиши отправки вводят вместо щелчка, когда это возможно - это позволяет избежать проблем, если браузер не имеет 100% масштаб. - person Zunair; 11.05.2020

Вы можете посетить страницу Прокручивать веб-элементы и Веб-страница - Selenium WebDriver с использованием Javascript:

public static void main(String[] args) throws Exception {

    // TODO Auto-generated method stub
    FirefoxDriver ff = new FirefoxDriver();
    ff.get("http://toolsqa.com");
    Thread.sleep(5000);
    ff.executeScript("document.getElementById('text-8').scrollIntoView(true);");
}
person virusrocks    schedule 14.07.2014
comment
@AbhishekBedi Я помню, что он тоже поддерживается в Chrome. С какой-либо конкретной проблемой вы могли столкнуться? - person virusrocks; 22.12.2015

В большинстве случаев для прокрутки этот код будет работать.

WebElement element = driver.findElement(By.xpath("xpath_Of_Element"));                 
js.executeScript("arguments[0].click();",element);
person sp324    schedule 19.02.2019

JAVA

Попробуйте прокрутить до элемента, используя позицию x y, и используйте JavascriptExecutor с этим аргументом: "window.scrollBy(x, y)".

После импорта:

import org.openqa.selenium.WebElement;
import org.openqa.selenium.JavascriptExecutor;

Сначала вам нужно определить x y местоположение элемента.

//initialize element
WebElement element = driver.findElement(By.id("..."));

//get position
int x = element.getLocation().getX();
int y = element.getLocation().getY();

//scroll to x y 
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("window.scrollBy(" +x +", " +y +")");
person frianH    schedule 05.09.2019

Я не уверен, что вопрос по-прежнему актуален, но после обращения к документации scrollIntoView из https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView.

Самым простым решением было бы

executor.executeScript("arguments[0].scrollIntoView({block: \"center\",inline: \"center\",behavior: \"smooth\"});",element);

Это прокручивает элемент в центр страницы.

person kiranjith    schedule 06.05.2020

По умолчанию Selenium прокручивает, поэтому элемент едва виден в верхней части области просмотра. Кроме того, не все браузеры ведут себя одинаково. Это очень неприятно. Если вы записываете видео тестов своего браузера, как это делаю я, вам нужно, чтобы элемент прокручивался в поле зрения и был центрирован по вертикали.

Вот мое решение для Java:

public List<String> getBoundedRectangleOfElement(WebElement we)
{
    JavascriptExecutor je = (JavascriptExecutor) driver;
    List<String> bounds = (ArrayList<String>) je.executeScript(
            "var rect = arguments[0].getBoundingClientRect();" +
                    "return [ '' + parseInt(rect.left), '' + parseInt(rect.top), '' + parseInt(rect.width), '' + parseInt(rect.height) ]", we);
    System.out.println("top: " + bounds.get(1));
    return bounds;
}

А затем для прокрутки вы вызываете это так:

public void scrollToElementAndCenterVertically(WebElement we)
{
    List<String> bounds = getBoundedRectangleOfElement(we);
    Long totalInnerPageHeight = getViewPortHeight(driver);
    JavascriptExecutor je = (JavascriptExecutor) driver;
    je.executeScript("window.scrollTo(0, " + (Integer.parseInt(bounds.get(1)) - (totalInnerPageHeight/2)) + ");");
    je.executeScript("arguments[0].style.outline = \"thick solid #0000FF\";", we);
}
person djangofan    schedule 04.03.2016
comment
Функция getViewPortHeight отсутствует ... В предположении, вы берете высоту целевого элемента - person Shubham Jain; 23.05.2017

Что-то, что сработало для меня, - это использовать метод Browser.MoveMouseToElement для элемента в нижней части окна браузера. Чудом это сработало в Internet Explorer, Firefox и Chrome.

Я предпочел эту технику инъекции JavaScript только потому, что она казалась менее хакерской.

person David Peters    schedule 21.02.2014
comment
Какой это язык программирования? - person akostadinov; 19.05.2020

Я тестировал компоненты ADF, и вам нужна отдельная команда для прокрутки, если используется ленивая загрузка. Если объект не загружен и вы пытаетесь найти его с помощью Selenium, Selenium выдаст исключение «элемент не найден».

person user3781490    schedule 27.06.2014

Если ничего не работает, попробуйте это, прежде чем нажимать:

public void mouseHoverJScript(WebElement HoverElement) {

    String mouseOverScript = "if(document.createEvent){var evObj = document.createEvent('MouseEvents');evObj.initEvent('mouseover', true, false); arguments[0].dispatchEvent(evObj);} else if(document.createEventObject) { arguments[0].fireEvent('onmouseover');}";
    ((JavascriptExecutor) driver).executeScript(mouseOverScript, HoverElement);
}
person Prateek    schedule 11.02.2016

В Java мы можем прокручивать с помощью JavaScript, как в следующем коде:

driver.getEval("var elm = window.document.getElementById('scrollDiv'); if (elm.scrollHeight > elm.clientHeight){elm.scrollTop = elm.scrollHeight;}");

Вы можете присвоить желаемое значение переменной elm.scrollTop.

person Hemant    schedule 10.04.2013

Решение:

public void javascriptclick(String element)
{
    WebElement webElement = driver.findElement(By.xpath(element));
    JavascriptExecutor js = (JavascriptExecutor) driver;

    js.executeScript("arguments[0].click();", webElement);
    System.out.println("javascriptclick" + " " + element);
}
person akhilesh gulati    schedule 14.02.2017

Этот код работает для меня:

JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("javascript:window.scrollBy(250, 350)");
person vishal Singh    schedule 27.11.2014
comment
Работает для меня. Реализация Dart WebDriver пока не имеет действий. - person Günter Zöchbauer; 30.07.2015

Selenium может автоматически прокручивать до некоторого элемента на полосе прокрутки для некоторого простого пользовательского интерфейса, но для пользовательского интерфейса с отложенной загрузкой по-прежнему требуется scrollToElement.

Это моя реализация на Java с JavascriptExecutor. Более подробную информацию можно найти в исходном коде Satix: http://www.binpress.com/app/satix-seleniumbased-automation-testing-in-xml/1958

public static void perform(WebDriver driver, String Element, String ElementBy, By by) throws Exception {
 try {
  //long start_time = System.currentTimeMillis();           
  StringBuilder js = new StringBuilder();
  String browser = "firefox";

  if (ElementBy.equals("id")) {
   js.append("var b = document.getElementById(\"" +
    Element + "\");");
  } else if (ElementBy.equals("xpath")) {
   if (!"IE".equals(browser)) {
    js.append("var b = document.evaluate(\"" +
     Element +
     "\", document, null, XPathResult.ANY_TYPE, null).iterateNext();");
   } else {
    throw new Exception("Action error: xpath is not supported in scrollToElement Action in IE");
   }
  } else if (ElementBy.equals("cssSelector")) {
   js.append("var b = document.querySelector(\"" +
    Element + "\");");
  } else {
   throw new Exception("Scroll Action error");
  }

  String getScrollHeightScript = js.toString() + "var o = new Array(); o.push(b.scrollHeight); return o;";

  js.append("b.scrollTop = b.scrollTop + b.clientHeight;");
  js.append("var tmp = b.scrollTop + b.clientHeight;");
  js.append("var o = new Array(); o.push(tmp); return o;");

  int tries = 1;
  String scrollTop = "0";
  while (tries > 0) {
   try {
    String scrollHeight = ((JavascriptExecutor) driver).executeScript(getScrollHeightScript).toString();
    if (scrollTop.equals(scrollHeight)) {
     break;
    } else if (driver.findElement(by).isDisplayed()) {
     break;
    }
    Object o = ((JavascriptExecutor) driver).executeScript(js.toString());
    scrollTop = o.toString();
    Thread.sleep(interval);
    tries++;
   } catch (Exception e) {
    throw new Exception("Action error:" +
     " javascript execute error : " + e.getMessage() + ", javascript : " + js.toString());
   }
  }

 } catch (Exception e) {
  try {
   ScreenshotCapturerUtil.saveScreenShot(driver, CLASSNAME);
  } catch (IOException e1) {
   throw new Exception("Save screenshot error!", e1);
  }
  throw e;
 }
}
person Effie    schedule 03.06.2014

Если эта передача объекта не работает:

await browser.executeScript( "arguments[0].scrollIntoView()", await browser.wait( until.elementLocated( By.xpath( "//div[@jscontroller='MC8mtf']" ) ), 1000 ) );

На странице Google есть демонстрация кнопки прокрутки до микрофона. Нашел его с помощью javascript xpath, используя chromedriver и selenium-webdriver.

start1 () запускает браузер в узком окне, кнопка микрофона не отображается.

start2 () запустите браузер в узком окне, затем перейдите к кнопке микрофона.

require('chromedriver');
const { Builder, 
        By, 
        Key, 
        until
      }                = require('selenium-webdriver');

async function start1()  {

  var browser = new Builder()
                    .forBrowser( 'chrome' )
                    .build();
  await browser
        .manage()
        .window()
        .setRect( { width: 80, 
                    height: 1040, 
                    x:-10, 
                    y:0} 
                );
  await browser.navigate().to( "https://www.google.com/" );
}

async function start2()  {

  var browser = new Builder()
                    .forBrowser( 'chrome' )
                    .build();
  await browser
        .manage()
        .window()
        .setRect( { width: 80, 
                    height: 1040, 
                    x:-10, 
                    y:0} 
                );
  await browser.navigate().to( "https://www.google.com/" );
  await browser.executeScript( "document.evaluate(\"//div[@jscontroller='MC8mtf']\", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.scrollIntoView(true);");
}

start1();
start2();
person Sándor Krisztián    schedule 17.08.2020

Для OpenQA.Selenium на C #:

WebDriver.ExecuteJavaScript("arguments[0].scrollIntoView({block: \"center\", inline: \"center\"});", Element);

Где WebDriver - это new ChromeDriver(options) или аналогичный.

person Iain Ballard    schedule 29.09.2020

Javascript

Решение простое:

const element = await driver.findElement(...)
await driver.executeScript("arguments[0].scrollIntoView(true);", element)
await driver.sleep(500);
person Masih Jahangiri    schedule 14.07.2021

Вот как я это делаю с помощью PHP webDriver для Selenium. Он работает для автономного сервера Selenium 2.39.0 + https://github.com/Element-34/php-webdriver + Firefox 25.0.

$element=$session->welement("xpath", "//input[@value='my val']");
$element->click();
$element=$session->welement("xpath", "//input[@value='ma val2']");
$element->location_in_view(); // < -- this is the candy
$element->click();

Примечание: я использую настроенную версию Element34 PHP-webdriver. Но в ядре никаких изменений нет. Я просто использую «элемент» вместо «элемент». Но на рассматриваемое дело это не влияет. Автор драйвера говорит, что «позволить почти всем вызовам API быть прямым преобразованием того, что определено в самом протоколе WebDriver». Так что у вас не должно возникнуть проблем с другими языками программирования.

Просто щелкнуть в моих настройках не получится. Он будет прокручивать вместо щелчка, поэтому мне пришлось дважды щелкнуть, не вызывая "location_in_view ()".

Примечание. Этот метод работает для элементов, которые можно просматривать, например для кнопки ввода типа.

Взгляните на: http://code.google.com/p/selenium/wiki/JsonWireProtocol#/session/:sessionId/element/:id/location

Описание для JsonWireProtocol # предлагает использовать location + moveto, потому что location _in_view - это внутренний метод.

person Konstantin Ivanov    schedule 27.01.2014

Сделайте случайный щелчок по странице:

driver.findElement(By.id("ID of a web element present below")).click

Затем выполняйте то, что хотите.

person Ankur Gaurav    schedule 21.07.2014

Я согласен со всеми здесь, кто говорит: «В Selenium есть опция неявной прокрутки». Также, если вы были в Selenium 1, а теперь обновили себя до Selenium 2 и ищете команды предыдущей версии, вы можете использовать команду, известную как:

Seleniumbackeddriver.

WebDriver driver = new FirefoxDriver();
public void setUp() throws Exception {

    String baseUrl = "http://www.google.co.in/";
    selenium = new WebDriverBackedSelenium(driver, baseUrl);
}

Вы можете использовать их и использовать команды обеих версий.

person Sriharsha Karanth    schedule 31.05.2014