当前位置: 首页 > 面试题库 >

selenium-旧元素参考:该元素未附加到页面

李永寿
2023-03-14
问题内容

我试图了解为什么在尝试显示从网站上获取的项目时会出现错误。我也在浏览器中使用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);
}

希望这对您有所帮助。谢谢。



 类似资料:
  • 我有一个下拉列表,我第一次能够按索引选择元素。当我第二次尝试选择元素时,它会抛出陈旧的元素引用错误。我尝试了try catch block,显式等待,但没有任何效果。

  • 我试图理解为什么在我试图显示从网站获取的项目时会出现错误。我也在使用谷歌chrome浏览器。 这是我代码的其他部分 每当我使用"chromeDriver.FindElement(By.ID(something.link.text))。单击();",它会给出一个错误。我不能显示我提取的数据。 在错误消息中,它显示“OpenQA.Selenium.StaleElementReferenceExcept

  • 我在执行selenium web测试时遇到了一个问题。在点击并进入下一页(这是正确的)后,我一直得到一个过时的元素引用错误

  • 我得到了这个错误,当我试图点击一个下拉ID: 我想用这个代码: 有没有什么方法可以防止无限循环,或者更好的方法在我得到这个异常后点击id?

  • 我正在构建一个刮网站的c#应用程序。我认为这个问题是因为页面在一次又一次提交表单后被重新加载而导致的。我必须从选择列表中选择一个选项,然后按回车键,等待页面重新加载新结果。但是重新加载后会导致此错误; 我的代码是这样的; 我也尝试过类似的东西; 时间不多了,我有个例外,时间不多了。

  • 所以我正在尝试制作一个在flickr上运行的程序,我已经准备好了所有的东西,直到cookies弹出,它打败了我。 我正在尝试切换到这个iframe,这样我就可以使用“全部接受”按钮。然而,iframe的ID是动态的,所以为了避免这个问题,我尝试以标题为目标。 但是我现在收到了这个错误消息。 我已经尝试添加了10秒的等待时间来给它加载时间,我知道错误的原因是元素不再连接到DOM,但我不知道要使用什么