C#Selenium元素未附加

时间:2018-03-30 10:25:38

标签: c# selenium select selenium-webdriver webdriver

我想从网站更改语言。下面你可以看到html源代码,c#selenium代码和错误。错误会停止我的程序,但奇怪的是语言发生了变化。我希望你能帮助我!

html源代码

<select class="_fsoey">
   <option value="de">Deutsch</option>
   <option value="en">English</option>
   <option value="it">Italiano</option>
   <option value="nb">Norsk</option>
   <option value="nl">Nederlands</option>
   <option value="pl">Polski</option>
</select>

C#Selenium代码

driver.FindElement(By.XPath("//select[@class='_fsoey']")).Click();
driver.FindElement(By.XPath("//option[contains(.,'English')]")).Click();

错误

陈旧元素引用:元素未附加到页面文档

4 个答案:

答案 0 :(得分:0)

您尝试与之互动的元素位于<select>标记内。因此,要从下拉列表中选择选项,您需要创建选择对象并调用方法SelectByValue()或{{ 1}}如下:

SelectByText()

答案 1 :(得分:0)

如果您已经发送了堆栈跟踪,那么我将能够给出一个更明确的答案,但是,看起来很可能从这两行之一抛出异常,并且我将解释为什么不久。我的猜测是后来的操作抛出异常。

首先,您说语言确实被选中,这意味着实际执行了最后一次点击。但这不是唯一的原因。

这两行中的每一行都执行2次对WebDriver的调用:对IWebDriver.FindElement的调用,返回IWebElement,然后调用IWebElement。点击第一次调用返回的对象。请注意,只能从IWebElement上的方法抛出StaleElementReferenceException,这意味着IWebDriver.FindElement成功。现在,StaleElementReferenceException意味着稍后从页面中删除了最初找到的元素。因为你不能在两次通话之间执行任何操作,所以这是不太可能的。

唯一可能发生这种情况的情况是,如果页面执行了某种asyc操作,删除了每行的这两个方法调用之间的元素。但话说回来,在这种情况下,正确选择语言是没有意义的。

对于我仍然错误的可能性很小,我会给你一个提示,帮助你进一步调查根本原因。如果捕获异常并检查IWebDriver.PageSource属性,则可以看到DOM的状态,并查看该元素是否实际被删除(至少在Chrome中)。如果你在调用FindElement之前检查它,你将能够比较它们并查看是否有变化。如果将PageSource属性的值保存为.html文件,则可以在浏览器中打开该文件并检查开发工具中的DOM。这可以帮助您了解您获得此异常的原因。

答案 2 :(得分:0)

您可以使用Select方法

Select dropdown = new Select(driver.findElement(By.xpath("//select[@class='_fsoey']")));
dropdown.selectByValue("en");  

您可以通过两种方法选择下拉值:SelectByValueSelectByIndex

答案 3 :(得分:0)

问题可能是,在您执行查找元素城市与从下拉列表中选择的时间之间,页面将被更改或刷新,这就是您获得陈旧元素异常的原因。在从下拉列表中选择之前尝试查找元素。如果情况并非如此,请提供更多详情