我试图了解为什么在尝试显示从网站上获取的项目时会出现错误。我也在浏览器中使用google chrome。
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:’stale元素引用:元素未附加到页面文档 ”。我检查了其他帖子,但没有弄清楚。我该如何解决?
据我了解,selenium的响应速度比网站开放时间快得多,因此它会产生错误。同样,它很少给出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(); }
如何转换成文字
我没有在c#中工作,但是在java / selenium中工作。但是,我可以为您提供克服陈旧的想法。
通常,如果在启动Webelement后更改了元素属性或某些内容,则将获得Stale Exception。例如,在某些情况下,如果用户尝试在同一页面上单击同一元素,但在页面刷新后单击,则会获得跟踪例外。
为了克服这个问题,如果页面被更改或刷新,我们可以创建新的Web元素。下面的代码可以给您一些想法(它在Java中,但是概念是相同的)
例:
webElement element = driver.findElement(by.xpath("//*[@id='StackOverflow']")); element.click(); //page is refreshed element.click();//This will obviously throw stale exception
为了克服这个问题,我们可以将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
在这种情况下,我们将收集一组网络元素并进行迭代以获取文本。但是,在收集Web元素后,Web元素似乎发生了一些变化,并且gettext引发了陈旧。我们可以使用循环并在旅途中创建元素并获取文本。
for(int i = 0; i<5; i++) { String value = driver.findElement(by.xpath("//.....["+i+"]")).getText); System.out.println(value); }
希望这对您有所帮助。谢谢。