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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Selenium在页面重新加载后不会在页面上找到元素相关的知识,希望对你有一定的参考价值。

我在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试图弄清楚什么是错的,我知道它并没有完全建议。我也是以更实际的方式使用它,但我已经将这些代码用于测试目的。

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

答案

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

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

另一答案

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

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

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

另一答案

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

            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上搜索它。

以上是关于Selenium在页面重新加载后不会在页面上找到元素的主要内容,如果未能解决你的问题,请参考以下文章

如何用python的selenium提取页面所有资源加载的链接

注销后刷新/重新加载页面

删除记录后PHP页面不会自动重新加载?

将 iframe URL 更改为另一个协议会重新加载页面,但不会在从计时器触发时重新加载

重新加载+导航到另一个页面后组件未销毁

selenium+python,如何判断一个页面已经加载完成?