Selenium не найдет элемент на странице после перезагрузки страницы - PullRequest
0 голосов
/ 30 августа 2018

У меня была эта проблема, после того как я перезагрузил страницу в веб-драйвере Java Selen, элемент, который я объявил заранее, больше не будет выбираться для отправки ключей. Например, я написал это, чтобы попытаться выяснить, в чем заключалась моя проблема.

package test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;

public class googleTest {
public static void main(String[] args)throws InterruptedException {

    WebDriver driver = new FirefoxDriver();
    driver.get("https://www.google.com");
    Thread.sleep(1000);
    WebElement search = driver.findElement(By.name("q"));

            search.sendKeys("test");
            Thread.sleep(1000);
            driver.navigate().refresh();
            Thread.sleep(1000);
            search.sendKeys("test");
}

}

В первый раз он выберет строку поиска и наберет тест. После этого при перезагрузке тест не будет отправлен на панель поиска. Я попытался найти его как другой WebElement, но это тоже не сработает. Я также использую thread.sleep, чтобы попытаться выяснить, что не так, я знаю, что это не совсем рекомендуется Я также использую это более практичным способом, но я сделал этот код только для целей тестирования.

Я новичок в этом, и любая помощь приветствуется, спасибо.

Ответы [ 3 ]

0 голосов
/ 30 августа 2018

Один из способов справиться с этим - снова идентифицировать этот элемент перед использованием следующим образом:

            WebDriver driver = new FirefoxDriver();
            driver.get("https://www.google.com");
            Thread.sleep(1000);
            WebElement search = driver.findElement(By.name("q"));

            search.sendKeys("test");
            Thread.sleep(1000);
            driver.navigate().refresh();
            Thread.sleep(1000);
            search = driver.findElement(By.name("q"));   //Searching for it again
            search.sendKeys("test");

Пояснение:

Как только вы обновите страницу, DOM веб-страницы изменится, и, следовательно, элемент, который вы определили и сохранили в качестве веб-элемента, будет недоступен, поэтому вам придется снова искать его в DOM после обновления.

0 голосов
/ 30 августа 2018

На самом деле после обновления страницы ранее указанные веб-элементы будут очищены и получат StaleElementException.

Если вы не хотите использовать PageFactory, лучше использовать неявное или явное ожидание (проверьте видимость элемента) вместо thread.sleep

0 голосов
/ 30 августа 2018

Да, это нормальное поведение Selenium!

Когда страница перезагружается, либо вы принудительно ее обновляете, либо обновляет браузер, все WebElements, найденные на этой странице, теперь будут выдавать StaleElementException.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...