Selenium - 陈旧元素引用:元素未附加到页面

Kaa*_*ken 10 html c# selenium selenium-chromedriver selenium-webdriver

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

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

chromeDriver.FindElement(By.Id("something.link.text")).Click();
chromeDriver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(5));
Run Code Online (Sandbox Code Playgroud)

而这是我代码的其他部分

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

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

在错误消息中,它显示" 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();
}
Run Code Online (Sandbox Code Playgroud)

如何转换为文本

san*_*mar 9

我没有在c#工作,但已经在java/selenium上工作过.但是,我可以给你一个克服陈旧性的想法.

通常,如果在启动webelement之后更改元素属性或某些内容,我们将获得Stale Exception.例如,在某些情况下,如果用户尝试在同一页面上单击同一元素但在页面刷新后,则会获取staleelement异常.

为了解决这个问题,我们可以创建新的webelement,以防页面被更改或刷新.下面的代码可以给你一些想法.(它在java中,但概念将是相同的)

例:

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

为了解决这个问题,我们可以将xpath存储在某个字符串中,然后使用它创建一个新的webelement.

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

在这种情况下,我们正在收集一组webelements并迭代以获取文本.但是在收集了webelements和gettext抛出陈旧之后,似乎有一些变化.我们可以使用循环并在旅途中创建元素并获取文本.

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

希望这对你有所帮助.谢谢.