为什么等等。直到不工作?错误:元素未附加到页面文档

时间:2017-03-23 19:40:57

标签: c# selenium selenium-webdriver selenium-chromedriver

我遇到此错误:元素未附加到页面文档

OpenQA.Selenium.StaleElementReferenceException : stale element reference: element is not attached to the page document

我正在使用wait.Until但是没有工作,有时我的测试正在通过,有时候没有通过。任何的想法?这是我的代码。感谢

        WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(20));
        IWebElement firstCategoryLink = wait.Until<IWebElement>(driver=> driver.FindElement(By.LinkText(table.Rows[0]["category"].ToString())));
        firstCategoryLink.Click();
        IWebElement firstSubcategoryLink = wait.Until<IWebElement>(d => d.FindElement(By.PartialLinkText(table.Rows[0]["subcategory"].ToString())));  
        firstSubcategoryLink.Click();
        IWebElement firstAddToCart = wait.Until<IWebElement>(driver => driver.FindElements(By.CssSelector(".products-list > .product > .p-link > .p-desc > .p-price-wrap > .addtocart.mid > .btn-addtocart"))[0]);
        costFirstWine = driver.FindElements(By.CssSelector(".products-list > .product > .p-link > .p-desc > .p-price-wrap > div > .product-price"))[0].Text;
        nameFirstWine = driver.FindElements(By.CssSelector(".products-list > .product > .p-link > .p-desc > .detail > .p-name > a"))[0].Text;
        firstAddToCart.Click();
        IWebElement secondCategoryLink = wait.Until<IWebElement>(driver => driver.FindElement(By.LinkText(table.Rows[1]["category"].ToString())));
        secondCategoryLink.Click();
        IWebElement secondSubcategoryLink = wait.Until(d => d.FindElement(By.PartialLinkText(table.Rows[1]["subcategory"].ToString())));
        secondSubcategoryLink.Click();
        IWebElement secondAddToCart = wait.Until<IWebElement>(d => d.FindElements(By.CssSelector(".products-list > .product > .p-link > .p-desc > .p-price-wrap > .addtocart.mid > .btn-addtocart"))[0]);
        costSecondWine = driver.FindElements(By.CssSelector(".products-list > .product > .p-link > .p-desc > .p-price-wrap > div > .product-price"))[0].Text;
        nameSecondWine = driver.FindElements(By.CssSelector(".products-list > .product > .p-link > .p-desc > .detail > .p-name > a"))[0].Text;
        secondAddToCart.Click();

1 个答案:

答案 0 :(得分:0)

有几种方法可以解决这个问题,我会按照我的偏好顺序排列:

  1. 在页面上找到最后加载的元素,在页面上执行任何其他操作之前等待该元素。注意:如果事情没有按顺序发生,这并不总是可行的。
  2. 这很容易做到这样:

    By pageLoaded = By.CssSelector("#some.pageload.selector");
    wait.Until(ExpectedConditions.ElementExists(pageLoaded));
    

    如果你有2或3件你最后知道的事情,但它们可能以不同的顺序发生,你可以等待所有这些。

    如果您使用的是Page Object Pattern,则可能要求所有PO都有一个WaitForPageToLoad方法,您可以在新的{{PageObject方法中为您调用该方法1}}已创建。无论你做什么,试图弄清楚一个地方加载页面等待是很重要的,所以如果页面改变,你不必在很多不同的地方改变等待。

    1. 有一个基本方法可以传递By,等待元素变得稳定。
    2. 我不会展示#2的例子,因为它会减慢你的测试速度,并且没有确定的方法可以说你应该等待多长时间才能确定元素是否“稳定”。如果你绝望,你可以这样做,但它可能导致竞争条件和维护困难。