java - Selenium Webdriver 抓取,陈旧的元素
问题描述
我正在编写一个小型抓取程序,它导航到带有链接列表的页面,
它单击第一个链接,打开一个新页面,获取一些详细信息,然后导航回带有链接列表的页面,然后尝试查找下一个链接,但我得到:
org.openqa.selenium.StaleElementReferenceException:过时的元素引用:元素未附加到页面文档
知道如何避免这种情况吗?
package scraping;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
public class yell {
private WebDriver driver;
@BeforeClass
public void beforeClass() {
System.setProperty("webdriver.chrome.driver", "C:\\Selenium\\ChromeDriver\\chromedriver.exe");
driver = new ChromeDriver();
}
@Test
public void verifySearchButton() throws InterruptedException {
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get(
"https://www.yell.com/ucs/UcsSearchAction.do?scrambleSeed=1634428901&keywords=farmers&location=bedfordshire");
List<WebElement> linkList = driver.findElements(By.xpath("//a [@class='businessCapsule--title']"));
Thread.sleep(2000);
for (int i = 0; i < linkList.size(); i++) {
System.out.println(linkList.get(i).getText());
System.out.println(linkList.get(i).getAttribute("href"));
linkList.get(i).click();
System.out.println("count start = " + i);
Thread.sleep(2000);
WebElement Add1 = driver.findElement(By.xpath("//span[contains(@itemprop,'streetAddress')]"));
String Add1val = Add1.getText();
WebElement Add2 = driver.findElement(By.xpath("//span[contains(@itemprop,'addressLocality')]"));
String Add2val = Add2.getText();
WebElement Add3 = driver.findElement(By.xpath("//span[contains(@itemprop,'postalCode')]"));
String Add3val = Add3.getText();
WebElement tel = driver.findElement(By.xpath("//span[contains(@class,'business--telephoneNumber')]"));
String telval = tel.getText();
System.out.println(Add1val + " , " + Add2val + " , " + Add3val + " , " + telval);
driver.navigate().back();
System.out.println("count end = " + i);
}
}
@AfterClass
public void afterClass() {
driver.quit();
}
}
解决方案
在您点击链接的那一刻,DOM 正在重建,导致您拥有的每个元素都linklist
失去与当前页面的任何关系,因此StaleElementReferenceException
.
如果您想访问第一页上列出的所有链接,最好保留链接,而不是元素本身。
List<String> linkList = driver.findElements(By.xpath("//a [@class='businessCapsule--title']"))
.stream()
.map(element -> element.getAttribute("href"))
.collect(Collectors.toList());
现在,当您拥有链接列表时,您可以直接点击任何后续链接,而不是单击特定元素。
driver.get(linkList.get(i));
推荐阅读
- sql-server - 如何在 Azure Synapse 中实现序列
- regex - 正则表达式匹配字符串中相同子字符串中最后一次出现的子字符串
- javascript - 尝试在浏览器中显示 pdf 文件
- javascript - 通过鼠标拖动以圆周运动相互旋转2个圆圈
- php - 刀片文件未显示
- css - 证明在父flex中不起作用的内容
- python - 如何使用 Apache Beam Python 将输出写入动态路径
- sql-server - SQL:聚合核心表时忽略不相关的 JOIN
- angular - 离子文本区域通过发布请求获得价值
- flutter - 在futurbuilder Flutter中没有触发项目构建器