我想从网站更改语言。下面你可以看到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();
错误
陈旧元素引用:元素未附加到页面文档
答案 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");
您可以通过两种方法选择下拉值:SelectByValue
和SelectByIndex
答案 3 :(得分:0)
问题可能是,在您执行查找元素城市与从下拉列表中选择的时间之间,页面将被更改或刷新,这就是您获得陈旧元素异常的原因。在从下拉列表中选择之前尝试查找元素。如果情况并非如此,请提供更多详情