c# – 在特定的IWebElement上使用webdriverwait
我将selenium webdriverwait方法应用于特定的IWebElement,以便在它们可用时获取此IWebElement的一些子元素.这是我的代码……
WebDriverWait wait = new WebDriverWait(driver,TimeSpan.FromSeconds(10)); IList<IWebElement> elementsA = wait.Until<IList<IWebElement>>((d) => { return driver.FindElements(By.XPath("//table[@class='boxVerde']")); }); foreach (IWebElement iwe in elementsA) { wait = new WebDriverWait(driver,TimeSpan.FromSeconds(10)); IList<IWebElement> elementsB = wait.Until<IList<IWebElement>>((d) => { return iwe.FindElements(By.XPath("tr/td/div/a")); //trying to fetch the anchor tags from the element }); } 它一直给我一个错误,说’元素不再附加到DOM’…我认为webdriver等待根本不起作用.我做错了什么人吗?非常感谢提前 解决方法
听起来你正在遭受陈旧元素的困扰.
Selenium发现的每个WebElement实际上都是对DOM内部元素的引用 有时,站点上使用的JavaScript会破坏并重新创建一个元素,当发生这种情况时,您的现有引用会变得陈旧,并且您将看到StaleElementReferenceException(至少这是它在Java领域中所调用的,您应该看到非常相似的东西). 因此,如果您看到StaleElementReferenceException或声明“元素不再附加到DOM”的消息,则意味着您以前对DOM中元素的引用不再有效,因为您引用了该元素已被摧毁. 这在视觉上并不总是很明显,因为原始元素可能已被破坏,然后重新创建了相同的元素,但它是一个新元素,因此您需要创建一个新的引用来与它进行交互. 创建新引用的方法是再次查找该元素. 你的问题并不完全清楚,但我假设你在找到表后迭代锚元素列表时遇到问题.如果是这种情况,则表明该表已被破坏并在您找到表元素的点之间重新创建,然后开始迭代表中的锚元素. 如果是这种情况,您将需要再次找到该表,一个有用的技巧是等待表变为陈旧,然后再尝试再找到它.通过这种方式,您可以合理地确信页面上任何破坏表然后重新创建它的JavaScript都已完成处理. .NET ExpectedConditions class并不像Java ExpectedConditions class那样成熟.我建议看看一些Java并将它们移植到.NET(它应该相当简单,结构非常相似),特别感兴趣的是Java等待元素变得陈旧. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |