我试图理解为什么在我试图显示从网站获取的项目时会出现错误。我也在使用谷歌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))。单击();",它会给出一个错误。我不能显示我提取的数据。
在错误消息中,它显示“OpenQA.Selenium.StaleElementReferenceException:'stale element reference:元素未附加到页面文档”。我查看了其他帖子,但没有找到答案。我该怎么解决呢?
正如我所读到的,硒提供了比网站打开时间更快的响应,所以它给出了错误。此外,很少,它给出硒不能定位元素。有什么建议吗?
编辑:如果我从显示函数中删除“.text”,它将显示“OpenQA.Selenium.Remote.RemoteWebElement”。字符串有问题吗?
EDIT2:我可以像这样保存从网站上获取的数据:
[i]="System.收藏。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();
}
如何转换为文本
我也经历过类似的情况。这里的主要问题是页面需要时间,所以我增加了时间。睡眠(秒),效果很好。
这种类型的错误通常是由更新的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--;
}
}
我没有在c#工作过,但在java/selenium上工作过。但是,我可以给你一个克服陈腐的想法。
一般来说,如果元素属性或其他东西在启动webelement后发生变化,我们将获得陈旧异常。例如,在某些情况下,如果用户试图在同一页面上点击相同的元素,但在页面刷新后,会获得stalle元素异常。
为了克服这个问题,我们可以创建新的webelement,以防页面被更改或刷新。下面的代码可以给你一些想法。(它是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.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);
}
希望这对你有帮助。谢谢
我的程序抛出一条错误消息“stale element reference:element未附加到页面文档”。当我查看前面的帖子(如Python Selenium陈旧元素修复)时,我发现我没有在调用click函数后更新url。我更新了网址。然而,它并没有解决这个问题。谁能指出我哪里出错了?下面是我的代码:
我正在尝试使用LinkText单击一个元素。如: 但是,我得到以下错误: 即使元素在网页上可见,它也无法使用LinkText找到该元素,这有什么原因吗?有解决这个问题的方法吗,请帮忙?
这是HTML结构如下所示 错误跟踪为:
我得到了这个错误,当我试图点击一个下拉ID: 我想用这个代码: 有没有什么方法可以防止无限循环,或者更好的方法在我得到这个异常后点击id?
我正在构建一个刮网站的c#应用程序。我认为这个问题是因为页面在一次又一次提交表单后被重新加载而导致的。我必须从选择列表中选择一个选项,然后按回车键,等待页面重新加载新结果。但是重新加载后会导致此错误; 我的代码是这样的; 我也尝试过类似的东西; 时间不多了,我有个例外,时间不多了。
我在我的selenium java项目中不断收到一条错误消息。