我正在写一个小的抓取程序,它导航到一个包含链接列表的页面,
它单击第一个链接,打开一个新页面,获取一些详细信息,然后导航回包含链接列表的页面,然后尝试查找下一个链接,但我得到:
组织。openqa。硒。StaleElementReferenceException:stale元素引用:元素未附加到页面文档
你知道我该怎么避免吗?
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正在重建,导致您在link list
中拥有的每个元素都失去与当前页面的任何关系,因此出现了StaleElementReequceExc0019
。
如果你想访问第一页列出的所有链接,最好保留链接,而不是元素本身。
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));
问题内容: 我取这个页面与该请求库中的Node.js,并使用解析身体cheerio。 调用已解析的响应正文,发现该页面的title属性为: …什么时候应该: 我尝试将请求库的选项设置为include ,但这似乎并没有改变任何东西。 如何保留这些字符? 问题答案: 该页面似乎是用iso-8859-1编码的。您需要通过传递并使用诸如node- iconv之 类的东西来告诉您退回未编码的缓冲区。 如果要
问题内容: 按计划运行Scrapy使我绕过Twist(ed)。 我以为下面的测试代码可以工作,但是第二次触发蜘蛛时出现错误: 我猜想,作为CrawlerProcess的一部分,Twisted Reactor会在不需要时再次启动,从而导致程序崩溃。有什么办法可以控制吗? 同样在这个阶段,如果有一种自动执行Scrapy Spider的替代方法可以按计划运行,我也很高兴。我试过了,但还是不能让它循环:
在Autoconf的第2版,大部分宏被重新命名以使用更加统一和具有描述性的命名方案。下面是被重新命名了的宏的原来名字, 随后给出了这些宏现在的名字。虽然为了保持向后兼容,旧名字仍然能够被autoconf程序所接受,旧名字都 被看作过时的。关于新的命名方案,参见 宏名 。AC—ALLOCAAC—FUNC—ALLOCA AC—ARG—ARRAY 因为用途有限而被删除了。AC—CHAR—UNSIGNED
问题内容: 到目前为止,我一直只使用scrapy并编写自定义类来使用ajax处理网站。 但是,如果我要使用scrapy-splash,据我所知,它会在javascript之后刮擦呈现的html,那么对我的抓取工具的速度会产生重大影响吗? 用scrapy刮擦香草html页面与使用scrapy-splash渲染javascript html所花费的时间之间的比较是什么? 最后,scrapy-splas
问题内容: 我在Selenium 2 Web驱动程序测试中具有以下代码,该代码在调试时有效,但是在构建中运行它时,大多数情况下会失败。我知道这一定与未刷新页面的方式有关,但不知道如何解决它,因此,任何有关我做错事情的指针都应该受到赞赏。我正在使用JSF primefaces作为我的Web应用程序框架。当我单击添加新链接时,会出现一个弹出对话框,其中包含一个输入框,我可以在其中输入日期,然后单击“保
问题内容: 我的网站上有一个选择控件。我正在使用页面对象与页面进行交互。如果我这样做(在我的课程下的前两行和我的方法中) 它以空指针失败。我也尝试了没有。 现在,如果我在我的方法中执行此操作,则一切正常,然后选择正确的项目 这是该控件的实际网页摘要(已编辑以保护无辜者) 让我说我可以解决我的问题, 但是 我不明白为什么“ 正常 ”路径无法正常工作。 问题答案: 那是因为该类具有以下构造函数: 见J