Selenium在页面重新加载后不会在页面上找到元素

问题描述 投票:0回答:3

我在java的selenium web驱动程序中重新加载页面之后一直有这个问题,我之前声明的元素将不再被选中以发送密钥。例如,我写这篇文章试图弄清楚我的问题是什么。

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");
}

}

第一次选择搜索栏,然后键入test。之后,在重新加载时,它不会将测试发送到搜索栏。我已经尝试重新找到它作为一个不同的WebElement,但这也不会工作。我也在使用thread.sleep试图弄清楚什么是错的,我知道它并没有完全建议。我也是以更实际的方式使用它,但我已经将这些代码用于测试目的。

我是新手,欢迎任何帮助,谢谢。

java selenium webdriver
3个回答
0
投票

实际上在刷新页面之后,早期指向的webElements将被清除并获得StaleElementException。

如果不想使用PageFactory那么最好使用Implicit或Explicit等待(检查元素的可见性)而不是thread.sleep


1
投票

是的,这是正常的Selenium行为!

当页面重新加载时,无论是强制它还是浏览器刷新,在该页面上找到的所有WebElements现在都会抛出StaleElementException

当页面重新加载时,您需要刷新所有元素,再次有效地找到它们。出于这个原因,大多数人尽快转向PageObject模型(也值得关注PageFactory),因为这简化了所有元素的刷新。


0
投票

处理它的一种方法是在使用之前再次识别该元素,如下所示:

            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");

说明:

刷新页面后,webPage的DOM会发生变化,因此您已识别并存储为webelement的元素将不可用,因此您必须在刷新后再次在DOM上搜索它。

© www.soinside.com 2019 - 2024. All rights reserved.