it-roy-ru.com

Как прокрутить определенный DIV с помощью Selenium WebDriver с Java?

Некоторые из WebElements не распознаются WebDriver, WebDriver не может найти элемент, который не виден в видимой области браузера.

Чтобы сделать WebElement видимым для WebDriver, нам нужно сделать этот элемент видимым в представлении браузера, чтобы прокрутить вниз по конкретному div!

Как я могу выполнить свое действие (прокрутить вниз и щелкнуть) в определенной области моей веб-страницы. Я много пробовал, мне не помогло. 

Пожалуйста, помогите мне решить мою проблему.

21
pandiaraj

Прокрутить вниз:

import org.openqa.Selenium.JavascriptExecutor;
WebDriver driver = new FirefoxDriver();
JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("scroll(0, 250)"); //y value '250' can be altered

Прокрутить вверх:

JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("scroll(250, 0)"); //x value '250' can be altered

Прокрутите внизу страницы:

JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("window.scrollTo(0,Math.max(document.documentElement.scrollHeight,document.body.scrollHeight,document.documentElement.clientHeight));");

или же

Actions actions = new Actions(driver);
actions.keyDown(Keys.CONTROL).sendKeys(Keys.END).perform();

Полная прокрутка вниз в замедленном режиме:

for (int second = 0;; second++) {
    if(second >=60){
        break;
    }
    ((JavascriptExecutor) driver).executeScript("window.scrollBy(0,400)", ""); //y value '400' can be altered
    Thread.sleep(3000);
}

или же

JavascriptExecutor jse = (JavascriptExecutor)driver;
for (int second = 0;; second++) {
    if(second >=60){
        break;
    }
    jse.executeScript("window.scrollBy(0,800)", ""); //y value '800' can be altered
    Thread.sleep(3000);
}

Прокрутите автоматически до вашего WebElement:

Point hoverItem =driver.findElement(By.xpath("Value")).getLocation();
((JavascriptExecutor)driver).executeScript("return window.title;");    
Thread.sleep(6000);
((JavascriptExecutor)driver).executeScript("window.scrollBy(0,"+(hoverItem.getY())+");"); 
// Adjust your page view by making changes right over here (hoverItem.getY()-400)

или же

((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoView();", driver.findElement(By.xpath("Value')]")));

или же

WebElement element = driver.findElement(By.xpath("Value"));
Coordinates coordinate = ((Locatable)element).getCoordinates(); 
coordinate.onPage(); 
coordinate.inViewPort();
8
Rupesh Shinde

Прежде всего, большинство ответов, размещенных здесь, просто не по теме. Сейчас я работаю с Selenium 2 и Selenium 3, веб-драйвер может обрабатывать прокрутку окна, чтобы сделать элемент видимым.

Для всех, кто публикует фрагменты вроде:

driver.execute_script('scrollBy(0, 250)')

вы не получите вопрос вообще!

На самом деле я до сих пор не нашел способа правильно смоделировать действие перетаскивания ручки прокрутки, но этот ответ кажется многообещающим - но я не пытался.

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

  1. Используйте Keys.ARROW_DOWN
  2. Используйте Keys.PAGE_DOWN

На самом деле есть третий способ, просто отказаться от Selenium и связаться с сайтом, если они предоставляют какой-либо API.

8
Junchao Gu

Самый простой способ сделать это - выполнить Javascript для прокрутки элемента вверх/вниз.

JavascriptExecutor jsExec = (JavascriptExecutor) driver;
jsExec.executeScript("document.getElementById('id').scrollDown += 100");
6
Marcelo Xavier
driver.get("http://www.***.com/");
driver.manage().window().maximize();
WebElement scroll = driver.findElement(By.id("someId"));
scroll.sendKeys(Keys.PAGE_DOWN);
3
Pavel Kononenko

Сначала вы должны сделать прокрутку, а не найти элемент, так что сделайте, как показано ниже:

document.getElementById("your div id").scrollTop(250);

После выше вы можете найти этот конкретный div.

Вы также можете попробовать ниже:

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

Другой способ сделать это, используя метод JavascriptExceutor's scrollIntoView():

WebElement DIVelement = driver.findElement(By.xpath("xpath to div"));

JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("arguments[0].scrollIntoView(true)". DIVelement);
2
kushal.8

Мой «ВРЕМЯ РАБОТЫ» - это прокрутить до позиции по координатам x и y элемента. Я также добавил смещение к y, чтобы любой верхний/нижний колонтитул или другой элемент не блокировали видимость элемента, к которому я хочу перейти.

У меня есть ответ на этот вопрос - 

Selenium webdriver не может нажать на ссылку за пределами страницы

0
yuva

Рассмотрим ваш HTML, как показано ниже:

<div id="someId" class="className" style="position: relative; top: 0px; left: opx;>

вы можете наблюдать атрибут style в div проверить значение top, которое равно 0px в приведенном выше примере

Теперь попробуйте сделать что-то вроде:

$('.className').animate({top: "-60px"});

который поможет вам прокрутить вниз . Это JavaScript-исполнитель, так что, конечно, вам нужно его реализовать.

0
Gaurav Lad

Ни один из опубликованных ответов не сработал для меня, однако я нашел решение, основанное на этом посте .

((JavascriptExecutor) driver).executeScript(
    "arguments[0].scrollTop=arguments[1].offsetTop",
    divWithScrollbarElement,
    elementToScrollTo);

где divWithScrollbarElement - это элемент div, который вы хотите прокрутить, а elementToScrollTo - это дочерний элемент, который вы хотите сделать видимым (который в моем случае фактически был родителем элемента, который я изначально пытался просмотреть). Если elementToScrollTo на самом деле еще не находится в DOM, вам может понадобиться использовать сценарий один раз, чтобы прокрутить вниз, насколько это возможно, а затем еще раз, когда загрузятся еще элементы.

0
Dave