Selenium - 陈旧元素参考:元素未附加到页面

新手上路,请多包涵

我试图理解为什么在我尝试显示从网站获取的项目时它会出错。我也在使用谷歌浏览器作为浏览器。

 chromeDriver.Navigate().GoToUrl("somewebsites");

chromeDriver.FindElement(By.Id("something.link.text")).Click();
chromeDriver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(5));

我代码的其他部分

var item = chromeDriver.FindElementsByXPath("//*[starts-with(@id,\"g_1_\")]/td[3]/span");
foreach (var value in item)
{
    Console.WriteLine(value.Text);
}

每当我使用“ chromeDriver.FindElement(By.Id(“something.link.text”)).Click();” ,它给出了一个错误。我无法显示我提取的数据。

在错误消息中,它说“ OpenQA.Selenium.StaleElementReferenceException:’陈旧的元素参考:元素未附加到页面文档“。我查看了其他帖子,但我没有弄清楚。我该如何解决?

正如我所读,selenium 的响应速度比网站打开时间快得多,因此它给出了错误。而且,很少,它给出了硒不能定位的元素。有什么建议吗?

编辑:如果我从显示功能中删除“ .text ”,它会显示“ OpenQA.Selenium.Remote.RemoteWebElement ”。字符串有问题吗?

EDIT2:我可以像这样保存从网站上获取的数据:

[i]=“System.Collections.ObjectModel.ReadOnlyCollection`1[OpenQA.Selenium.IWebElement]” 为此,我写了这样的东西:

 string[] test= new string[100];

for (int i = 0; i < 100; i++)
{
     kaan[i] = driver.FindElements(By.XPath("//*[starts-with(@id,\"g_1_\")]/td[3]/span")).ToString();
}

我怎样才能转换成文字

原文由 Kaan Taha Köken 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 497
2 个回答

我没有在 c# 中工作过,但在 java/selenium 上工作过。但是,我可以给你克服陈旧的想法。

通常,如果在启动 web 元素后元素属性或某些内容发生更改,我们将收到 Stale Exception。例如,在某些情况下,如果用户尝试单击同一页面上的同一元素,但在页面刷新后,会出现 staleelement 异常。

为了克服这个问题,我们可以创建新的网络元素,以防页面发生更改或刷新。下面的代码可以给你一些想法。(它在 java 中,但概念是一样的)

例子:

  webElement element = driver.findElement(by.xpath("//*[@id='StackOverflow']"));
 element.click();
 //page is refreshed
 element.click();//This will obviously throw stale exception

为了克服这个问题,我们可以将 xpath 存储在一些字符串中,并使用它创建一个新的网络元素。

 String xpath = "//*[@id='StackOverflow']";
driver.findElement(by.xpath(xpath)).click();
//page has been refreshed. Now create a new element and work on it
driver.findElement(by.xpath(xpath)).click();   //This works

在这种情况下,我们正在收集一组网络元素并迭代以获取文本。但似乎在收集网络元素后网络元素发生了一些变化,gettext 抛出陈旧。我们可以使用循环并随时创建元素并获取文本。

 for(int i = 0; i<5; i++)
{
   String value = driver.findElement(by.xpath("//.....["+i+"]")).getText);
   System.out.println(value);
}

希望这对你有帮助。谢谢。

原文由 santhosh kumar 发布,翻译遵循 CC BY-SA 4.0 许可协议

这种类型的错误通常是由更新的 DOM 引起的。我建议您在所有包含 javascript/ajax 调用的页面上实际等待这些调用完成,然后再与网站交互。我通常在页面加载后执行此等待,并在执行某种触发 javascript/ajax 调用和/或更新 DOM 的操作时执行。实际上,这意味着在页面加载(或与之交互)后运行以下函数,然后找到您要与之交互的元素。

 public void WaitForJqueryAjax() {
        int delay = MaxdelaySeconds;
        while(delay > 0) {
            Thread.Sleep(1000);
            var jquery = (bool)(this.driver as IJavaScriptExecutor)
                .ExecuteScript("return window.jQuery == undefined");
            if(jquery) {
                break;
            }
            var ajaxIsComplete = (bool)(this.driver as IJavaScriptExecutor)
                .ExecuteScript("return window.jQuery.active == 0");
            if(ajaxIsComplete) {
                break;
            }
            delay--;
        }
    }

原文由 Agent Shoulder 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题