Ответ 1
scrollIntoView
Метод DOM scrollIntoView
только прокручивает элемент в представлении. Если scrollIntoView
не может прокручивать элемент в представлении, он просто терпит неудачу. Я добавил невидимый элемент в начало body
и назвал его scrollIntoView
. Ничего не прокручивалось, но ошибки не было. Обратите внимание, что у вас больше контроля над тем, как элемент прокручивается с помощью scrollIntoView
, чем с помощью moveToElement
. Селен заинтересован только в том, чтобы представить элемент в поле зрения, чтобы мышь могла быть помещена на него. Это не дает вам никаких заявлений о том, как это будет сделано. scrollIntoView
однако позволяет вам, например, указать, хотите ли вы, чтобы верх или низ элемента были выровнены с его прокручиваемым предком. (Подробнее см. здесь.
moveToElement
Метод Selenium moveToElement
выполняет две функции: он прокручивает элемент в представлении и перемещает мышь поверх элемента. Я также тестировал его с элементами, которые нельзя прокручивать или перемещать, потому что они не имеют координат на экране и не имеют здесь никакой ошибки.
Выбор одного
По умолчанию я использую moveToElement
со следующими исключениями:
-
Если вы не хотите вообще влиять на то, где Selenium поместил мышь, но вы хотите прокрутить что-то в поле зрения (немного странно... но возможно), тогда вы должны использовать
scrollIntoView
. -
Если вам нужно прокрутить элемент с видом элемента управления, который
scrollIntoView
дает вам (например, параметр выравнивания, упомянутый выше), вы должны использовать его, а неmoveToElement
. -
Бывают случаи, когда попытки имитировать поведение пользователя с помощью команд Selenium невозможно или очень дорого сделать, отправив серию команд Selenium. (Каждая команда - это кругооборот в сети. Когда сервер тестирования где-то через Интернет, он складывается.) В таких случаях я использую Selenium
executeScript
. В этом случае может быть полезно использоватьscrollIntoView
в script, а затем завершить script, создатьAction
для выполнения прокрутки и завершить всю операцию с помощью другогоexecuteScript
.