Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Selenium Webdriver刮片,过时元素_Java_Selenium_Selenium Webdriver_Web Scraping - Fatal编程技术网

Java Selenium Webdriver刮片,过时元素

Java Selenium Webdriver刮片,过时元素,java,selenium,selenium-webdriver,web-scraping,Java,Selenium,Selenium Webdriver,Web Scraping,我正在写一个小的抓取程序,它导航到一个包含链接列表的页面 它单击第一个链接,打开一个新页面,获取一些详细信息,然后导航回包含链接列表的页面, 然后它试图找到下一个链接,但我得到: org.openqa.selenium.StaleElementReferenceException:stale元素引用:元素未附加到页面文档 你知道我怎样才能避免这种情况吗 package scraping; import java.util.List; import java.util.concurrent.Ti

我正在写一个小的抓取程序,它导航到一个包含链接列表的页面

它单击第一个链接,打开一个新页面,获取一些详细信息,然后导航回包含链接列表的页面, 然后它试图找到下一个链接,但我得到:

org.openqa.selenium.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();
    }

}
包装刮削;
导入java.util.List;
导入java.util.concurrent.TimeUnit;
导入org.openqa.selenium.By;
导入org.openqa.selenium.WebDriver;
导入org.openqa.selenium.WebElement;
导入org.openqa.selenium.chrome.ChromeDriver;
导入org.testng.Assert;
导入org.testng.annotations.AfterClass;
导入org.testng.annotations.BeforeClass;
导入org.testng.annotations.Test;
公开课叫喊{
私有网络驱动程序;
@课前
类()之前的公共无效{
System.setProperty(“webdriver.chrome.driver”,“C:\\Selenium\\ChromeDriver\\ChromeDriver.exe”);
驱动程序=新的ChromeDriver();
}
@试验
public void verifySearchButton()引发InterruptedException{
driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS);
司机,快(
"https://www.yell.com/ucs/UcsSearchAction.do?scrambleSeed=1634428901&keywords=farmers&location=bedfordshire");
List linkList=driver.findElements(By.xpath(//a[@class='businessCapsule--title']);
《睡眠》(2000年);
对于(int i=0;i
当您跟随链接时,DOM正在被重建,导致
链接列表中的每个元素都与当前页面失去任何关系,因此出现
StaleElementReferenceException

如果您想访问第一页上列出的所有链接,最好保留这些链接,而不是元素本身

List<String> linkList = driver.findElements(By.xpath("//a [@class='businessCapsule--title']"))
  .stream()
  .map(element -> element.getAttribute("href"))
  .collect(Collectors.toList());

对于调试,请尝试增加Thread.sleep(10000),并在发现问题后清除if。错误发生在哪个代码行?谢谢Eugene。。。一个伟大的解决方案。。。。现在工作很好。。。
    driver.get(linkList.get(i));