如何使用Java单击Selenium中每个菜单的子链接

时间:2018-04-29 16:21:19

标签: selenium

我正在尝试使用链接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:陈旧元素引用:元素未附加到页面文档

2 个答案:

答案 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中存在某些子菜单子项但由于某些原因不可见,则此代码将失败。

如果这是一个测试,我建议做一些单独的测试,涵盖一些例子(并断言点击引导到预期的页面),而不是循环遍历所有内容。这将使自己和他人更容易理解测试。