我遇到此错误:元素未附加到页面文档
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();
答案 0 :(得分:0)
有几种方法可以解决这个问题,我会按照我的偏好顺序排列:
这很容易做到这样:
By pageLoaded = By.CssSelector("#some.pageload.selector");
wait.Until(ExpectedConditions.ElementExists(pageLoaded));
如果你有2或3件你最后知道的事情,但它们可能以不同的顺序发生,你可以等待所有这些。
如果您使用的是Page Object Pattern
,则可能要求所有PO
都有一个WaitForPageToLoad
方法,您可以在新的{{PageObject
方法中为您调用该方法1}}已创建。无论你做什么,试图弄清楚一个地方加载页面等待是很重要的,所以如果页面改变,你不必在很多不同的地方改变等待。
By
,等待元素变得稳定。我不会展示#2的例子,因为它会减慢你的测试速度,并且没有确定的方法可以说你应该等待多长时间才能确定元素是否“稳定”。如果你绝望,你可以这样做,但它可能导致竞争条件和维护困难。