Селен - перебирать элементы - PullRequest
0 голосов
/ 18 апреля 2019

Моя цель:

  • Итерация по веб-элементам на веб-странице
  • Нажмите на все найденные элементы и откройте ссылку в том же сеансе
  • Разобрать новую страницу с другой логикой
  • Вернуться на предыдущую страницу и продолжить цикл для всех идентификаторов с предыдущим совпадением

У меня есть этот код:

List<WebElement> links = driver.findElements(By.cssSelector("div[data-sigil='touchable']"));

// this will display list of all images exist on page
for(WebElement ele:links)
{
    System.out.println("test->"+ele.getAttribute("id"));
    ele.click();
    Thread.sleep(500);
    System.out.println("URI->"+driver.getCurrentUrl());
    js.executeScript("window.history.go(-1)");
} 

return "ok";

, который работает нормально и находит правильный идентификатор элемента, "ele.click ()" на самом деле работает, но я всегда терплю неудачу при выполнении js.executeScript("window.history.go(-1)")

Это мое сообщение об ошибке:

org.openqa.selenium.StaleElementReferenceException: stale element reference: element is not attached to the page document
  (Session info: chrome=73.0.3683.103)
  (Driver info: chromedriver=2.40.565498 (ea082db3280dd6843ebfb08a625e3eb905c4f5ab),platform=Windows NT 10.0.17134 x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 0 milliseconds

Так что в принципе я не могу продолжить цикл. Есть ли какая-нибудь полезная техника для «перехода на новую вкладку» и управления другим сеансом драйвера Selenium?

Заранее большое спасибо за любые предложения.

Ответы [ 2 ]

1 голос
/ 18 апреля 2019

Что происходит, когда вы переходите на другую страницу, это делает все элементы в списке устаревшими. Эти элементы не прикрепляются к странице, когда вы снова возвращаетесь на страницу. Вам нужно найти элементы каждый раз, когда вы загружаете страницу.

Попробуйте это:

List<WebElement> links = driver.findElements(By.cssSelector("div[data-sigil='touchable']"));
        // this will display list of all images exist on page
String address;
        for(int i=0; i<links.size(); i++){
            address = driver.getCurrentUrl();
            links = driver.findElements(By.cssSelector("div[data-sigil='touchable']"));
            System.out.println("size: "+links.size());
            WebElement ele = links.get(i);
            System.out.println("test->"+ele.getAttribute("id"));
            ele.click();
            Thread.sleep(500);
            System.out.println("URI->"+driver.getCurrentUrl());
            //js.executeScript("window.history.go(-1)");
            //driver.navigate().back();
            driver.get(address);
        }

Редактировать:

Попробуйте driver.get(), пока он ожидает загрузки страницы. Или вы можете напрямую добавить еще один сон, как вы использовали после щелчка.

1 голос
/ 18 апреля 2019

Я думаю, вам нужно создать объект js, вот так.

Причина в том, что вы "потеряли" ссылку на JavascriptExecutor

List<WebElement> links = driver.findElements(By.cssSelector("div[data-sigil='touchable']"));
// this will display list of all images exist on page
for(WebElement ele:links){
    System.out.println("test->"+ele.getAttribute("id"));
    ele.click();
    Thread.sleep(500);
    System.out.println("URI->"+driver.getCurrentUrl());
    // Re initialise js executor
    JavascriptExecutor js = (JavascriptExecutor) driver;
    js.executeScript("window.history.go(-1)");
} 
return "ok";
...