我正在尝试使用链接https://www.bloomingdales.com/ 点击每个菜单的子链接。下面是我试过的代码。
public void iClickOnFOBSShouldVerifyTheRespectivePages() throws Throwable {
List allElements = Elements.findElements(By.xpath("//ul[@id='mainNav']/li/a"));
for (int i = 0; i <= allElements.size(); i++) {
List<WebElement> links = Elements.findElements(By.xpath("//ul[@id='mainNav']/li/a"));
WebElement ele = links.get(i);
ele.click();
List<WebElement> childlinks = Elements.findElements("left_facet.left_nav");
for (int j = 0; j <= childlinks.size(); j++) {
List<WebElement> ele2 = Elements.findElements(By.xpath("left_facet.left_nav"));
WebElement ele3 = links.get(i);
ele3.click();
Navigate.browserBack();
}
}
以下是我得到的错误
org.openqa.selenium.StaleElementReferenceException:陈旧元素引用:元素未附加到页面文档
答案 0 :(得分:0)
试试这个::列表&lt; WebElement &gt; ele = driver.findElements( By.xpath(“// ul [@ id ='mainNav'] / li / a”) 强>); Actions act = new Actions(driver);
Thread.sleep(4000);
for (int i = 0; i <= ele.size(); i++) {
WebElement a =ele.get(i);
act.moveToElement(a).build().perform();
Thread.sleep(2000);
List<WebElement>ChildMenu=driver.findElements(By.xpath("//nav[@id='nav']/div[2]/div/div/div[@class='flyoutCol']/div/ul/li"));
System.out.println("Sub-Menu="+ChildMenu.size());
for(int j=0;j<ChildMenu.size();j++){
ChildMenu.get(i).click();
Thread.sleep(2000);
driver.navigate().back();
Thread.sleep(2000);
act.moveToElement(a).build().perform();
答案 1 :(得分:0)
点击任何链接后,浏览器将打开一个新页面。此时页面中对应于allElements,ele和ele2的元素在浏览器中消失(&#34;元素未附加到页面文档&#34;),因此不再有效。我希望第一次点击一个子菜单的孩子会起作用,但之后的任何事情都会失败。
你可以做的是首先检查每个子菜单有多少个孩子,将它存储在一个数组中,然后创建一个类似于你已经完成的双循环。对于每个子菜单和子菜单子项单击,您不能使用程序内存中的任何元素,因为它们的状态已更改,因此您需要初始化一个全新的元素。
使用xpath,您应该能够直接引用像父母 - 第3子菜单 - 第7个子菜单子元素这样的元素。 遗憾的是,我无法快速创建工作代码,否则我会这样做。
我想知道的是:这段代码的目的是什么?您不做任何断言,因此如果任何子菜单点击导致错误页面,您的代码将不会失败。这是期望的吗?如果点击甚至没有打开错误页面,它甚至可能不会失败。我想如果HTML中存在某些子菜单子项但由于某些原因不可见,则此代码将失败。
如果这是一个测试,我建议做一些单独的测试,涵盖一些例子(并断言点击引导到预期的页面),而不是循环遍历所有内容。这将使自己和他人更容易理解测试。