我的WebDriver脚本只是在第1页(产品展示页)上找到元素,然后单击第1个元素,看看它是否工作,然后导航回产品展示页。
它抛出过时的元素引用错误,并且没有单击页面上的第二个元素,表示元素没有附加到页面。
代码是:
public class EcommerceSearchResult {
public static WebDriver driver ;
public static void main(String[] args) throws InterruptedException {
System.setProperty("webdriver.chrome.driver", "C:\\chromedriver_win32\\chromedriver.exe");
driver = new ChromeDriver();
driver.manage().window().maximize();
driver.get("http://store.demoqa.com/");
WebElement searchBox = driver.findElement(By.xpath("//input[contains(@class,'search')]"));
searchBox.sendKeys("iphone"+"\n");
List<WebElement> gridrow
= driver.findElements
(By.xpath(".//*[@id='grid_view_products_page_container']/div/div"));
int count = gridrow.size();
System.out.print(count);
for(int i = 0 ; i<count ; i++)
{
List<WebElement> listingelementinloop = driver.findElements(By.xpath(".//*[@id='grid_view_products_page_container']/div/div"));
System.out.println(gridrow.get(i).getText());
listingelementinloop.get(i).click();
driver.navigate().back();
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}
}
}
下面是您的问题的解决方案代码。在我的机器上进行了测试,并附上了控制台截图。
import java.util.List;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
public class EcommerceSearchResult {
public static WebDriver driver ;
public static void main(String[] args) throws InterruptedException {
System.setProperty("webdriver.chrome.driver", "C:\\chromedriver_win32\\chromedriver.exe");
driver = new ChromeDriver();
driver.manage().window().maximize();
driver.get("http://store.demoqa.com/");
WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement searchBox = driver.findElement(By.xpath("//input[contains(@class,'search')]"));
searchBox.sendKeys("iphone"+"\n");
List<WebElement> gridrow = driver.findElements(By.xpath(".//*[@id='grid_view_products_page_container']/div/div"));
int count = gridrow.size();
System.out.print(count+"\n");
for(int i = 0 ; i<count ; i++)
{
WebElement listingelementinloop = driver.findElement(By.xpath(".//*[@id='grid_view_products_page_container']/div/div["+(i+1)+"]"));
System.out.println(listingelementinloop.getText());
listingelementinloop.findElement(By.xpath(".//div/a")).click();
wait.until(ExpectedConditions.urlContains("products-page/product-category"));
driver.navigate().back();
wait.until(ExpectedConditions.titleIs("iphone | Search Results | ONLINE STORE"));
}
}
}
问题是,您正在循环浏览从页面收集的元素集合。一旦离开或重新加载该页面,您存储的元素引用就会过时,从而导致错误。解决这个问题的一种方法是在集合中使用索引,并循环使用该索引。我重写了你的代码,利用函数来处理重复的操作。我已经测试了这段代码,它是有效的。
main的一部分
driver.get("http://store.demoqa.com/");
Search("iphone");
for (int i = 0; i < GetProductCount(); i++)
{
ClickProduct(i);
driver.navigate().back();
}
和辅助功能
public void Search(String searchTerm)
{
driver.findElement(By.cssSelector("input[value='Search Products']")).sendKeys(searchTerm + "\n");
}
public void ClickProduct(int index)
{
driver.findElements(By.cssSelector("h2 > a")).get(index).click();
}
public int GetProductCount()
{
return driver.findElements(By.cssSelector("h2 > a")).size();
}
在循环中,您需要替换以下行:
System.out.println(gridrow.get(i).getText());
与
System.out.println(listingelementinloop.get(i).getText());
同样,一旦你点击浏览器的“后退”按钮,gridrow列表中的元素就会过时。
或者,以下是执行相同任务的另一种方式:
public static WebDriver driver ;
public static void main(String[] args) throws InterruptedException {
System.setProperty("webdriver.chrome.driver", "C:\\chromedriver_win32\\chromedriver.exe");
driver = new ChromeDriver();
driver.manage().window().maximize();
driver.get("http://store.demoqa.com/");
WebElement searchBox = driver.findElement(By.xpath("//input[contains(@class,'search')]"));
searchBox.sendKeys("iphone"+"\n");
List<WebElement> gridrow
= driver.findElements
(By.xpath(".//*[@id='grid_view_products_page_container']/div/div"));
int count = gridrow.size();
System.out.print(count);
for(int i = 1 ; i<=count ; i++)
{
WebElement element =
driver.findElement(By.xpath(".//*[@id='grid_view_products_page_container']/div/div[" + i + "]"));
System.out.println(element.getText());
element.click();
driver.navigate().back();
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}
}
}
如果您还有任何疑问,请告诉我。
我有一个下拉列表,我第一次能够按索引选择元素。当我第二次尝试选择元素时,它会抛出陈旧的元素引用错误。我尝试了try catch block,显式等待,但没有任何效果。
我有一个客户想要从网站上抓取一些信息。循环第一次工作,但第二次发生错误。有什么帮助吗?我也不建议去实际的网站,它很粗略。 代码: 错误: selenium.common.exceptions.StaleElementReferenceException:消息:陈旧的元素引用:元素未附加到页面文档 完全终端回溯: 完成回溯(最近的最后一次调用):文件"c:\用户\Heage\Coding\自由职业\
问题内容: 在我的C#应用程序中使用Selenium Web驱动程序时,出现以下错误: OpenQA.Selenium.StaleElementReferenceException:陈旧元素引用:元素未附加到页面文档 在此代码中: 错误行在中,但这是在XPath之前指定的相同链接中成功执行但在最后一次尝试中失败的过程!那么这个错误是什么意思以及如何解决呢? 问题答案: 这意味着在页面中更改的元
我试图点击以下按钮使用xpath在selenium, 我试过下面的代码, 我得到以下错误, 组织。openqa。硒。StaleElementReferenceException:stale元素引用:元素未附加到页面文档 我想我之所以面临这个问题,是因为它是作为一个div而不是按钮封闭的。
我正在写一个小的抓取程序,它导航到一个包含链接列表的页面, 它单击第一个链接,打开一个新页面,获取一些详细信息,然后导航回包含链接列表的页面,然后尝试查找下一个链接,但我得到: 组织。openqa。硒。StaleElementReferenceException:stale元素引用:元素未附加到页面文档 你知道我该怎么避免吗?
我试图自动化YouTube搜索,点击搜索结果,然后跟随右侧的推荐视频。我写的代码进入youtube,进行搜索,点击视频,视频就会在浏览器上打开。但是,我不能带它点击其中一个推荐的视频。 问题似乎在于,当我使用从右边获取推荐视频元素的列表时,我得到的是上一页的列表(当我第一次输入单词并获得搜索结果时)。 当我使用直接转到视频链接时,代码确实可以正常工作,而不是先进行搜索。 所以当我点击(最后一行)时