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提取页面所有资源加载的链接