当前位置: 首页 > 知识库问答 >
问题:

Java Selenium stale元素引用,使用AjaxLocatorFactory

诸葛茂勋
2023-03-14

我有一个超类Component,在这个类中,我存储了访问附加到组件的元素的常用方法。

组件构造函数中,我使用pagefactory初始化元素

PageFactory.initElements(new AjaxElementLocatorFactory(root,10), this);

据我所知,只要元素由@FindBy注释,这将自动保持元素引用的新鲜。

我有一个专门的Component,叫做SearchResultRow,它扩展了Component

在这个组件中,我拥有与搜索结果中的一行相关的所有WebElements。

我想做的是获取第一个搜索结果并点击它。这是我的代码。

public void clickOnFirstResult() {
    WebElement firstUser = wait.until(ExpectedConditions.elementToBeClickable(searchResultRoot.findElement(By.cssSelector("tbody > tr:nth-child(1)"))));
    new SearchResultRow(firstUser).clickOn(SearchModel.NAME);
}

在这里,我等待元素变得可点击,因为@FindBy注释没有涵盖它是一个动态元素。

搜索模型。名称是指在SearchResultRow组件中由@FindBy注释的WebElement。然而,这种方法有时会产生10-15%的误差

过时元素引用:元素未附加到页面文档

共有2个答案

禹昆
2023-03-14

这是由动态DOM引起的<代码>等待。直到(ExpectedConditions.element可禁用)(searchResultRoot.findElement(由.css选择器(“tbody

巫马安怡
2023-03-14

陈旧元素引用是指在页面刷新之前获得但试图使用的web元素(即在所述刷新之后调用单击()方法。)

等待等待页面重新加载的最佳方式是什么?一种方法是使用隐式等待。一种非常常见的隐式等待时间的方法:

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

在SeleniumJava中就是这样做的,但是对于您使用的任何版本的Selenium,都应该有一个等效的方法。现在的问题是,这有什么用?这是告诉web驱动程序在尝试获取web元素之前等待给定时间的方法。当设置了隐式等待时间时,它将在测试会话期间保持设置。因此,这通常是在任何测试开始执行之前的一开始就完成的。更具体地说,您应该在获得web驱动程序实例后立即执行此操作。

也就是说,这还不够。例如,如果组件在初始加载页面后变得陈旧,该怎么办?为此,您应该使用ExpectedConditions类并设置显式等待某个条件发生:

WebDriverWait wait = new WebDriverWait(driver, 10); // timeout of 10 seconds and polling the default value of 500 ms, or...
WebDriverWait wait = new WebDriverWait(driver, 10, 100); // timeout of 10 seconds and polling every 100 ms

然后使用waitobject设置预期条件并获取所需的web元素

WebElement element = wait.until(...);

您将需要向上述方法传递适当的Accected条件。常见的用于避免老化的:

WebElement element = wait.until(ExpectedConditions.elementSelectionStateToBe(...));
WebElement element = wait.until(ExpectedConditions.refreshed(...));

最后,在与元素交互之前,您将检查元素的状态。例如:

WebElement newElement = wait.until(ExpectedConditions.elementToBeClickable(element));
newElement.click();

在这种情况下,elementnewElement是同一个对象,因此只需使用wait即可。直到(预期条件。元素可选择(元素)) 元素之前,code>应该足够了。单击()。至此,您已经确定该元素不是过时的,并且是可见的和已启用的;因此,可以安全地单击(例如)。

 类似资料:
  • 我知道这方面有很多问题,但似乎没有任何帮助。使用键打开一个新的选项卡或窗口,这样元素就不会过时,这并没有任何作用。不会打开新选项卡。它什么也没做。我正在抓取一个网站,主页上有一个链接列表,我需要通过点击每个链接循环,并从每个链接获取数据。在第一次迭代之后,当它回到主页面时,元素显然已经过时了。这是我第一次使用Selenium,所以我为这个天真的问题道歉,但我已经被困了好几天了,现在我迫切需要一些帮

  • 我希望有一个元素引用同级,但我不确定如何在我的模式中实现它。我的简历中有以下内容。xml文件: 这意味着每位员工都将有一名主管,他也是员工,因此,如果可能的话,我希望向他们推荐。 “pid”是我在模式中创建的一种类型,它只是一个由6位数字组成的字符串。 我的简历中有以下内容。xsd文件: 它给出以下错误: 错误-cvc类型。3.1.1:元素“supervisor”是一个简单类型,因此它不能有属性,

  • 问题内容: 使用D3库将SVG元素置于z顺序顶部的有效方法是什么? 我的特定情况是一个饼图其中突出(通过添加到)当鼠标在给定的片。生成我的图表的代码块如下: 我已经尝试了几种选择,但到目前为止还没有运气。同时使用和调用均无效。 在我的CSS中,“ top”类的定义如下: 该语句可以确保我知道它正确打开/关闭。它是。 我听说过使用是一个选项,但是我不清楚如何将“ selected”元素置于顶部。 更

  • 我有这个网站:http://embed.plnkr.co/Bs5iDqtXSSnvye2ORI6k/preview 代码: 和以下规格: 这种配置: 当我运行Protractor时,会出现以下错误: StaleElementReferenceError:过时元素引用:元素未附加到页面文档(会话信息:chrome=43.0.2357.81) (驱动程序信息:chronidriver=2.15.322

  • 我需要访问'Enterprise'和'Enter'文件夹的folderId。 这是我的代码: 字符串S1=driver.findElement(By.xpath(“//SPAN[.='\”Enterprise\“']/祖先::pre/follows-sibling::pre[1]/SPAN[2]”)).getText(); 我想打印字符串s1和s2的值,而不带COTES。我可以访问'Enterpr

  • 在使用Python进行测试驱动开发时,我目前在迁移后立即运行功能测试时遇到了“StaleElementReferenceException”。以下是错误的全文: 以下是测试: 如何配置测试以防止出现这种情况?Selenium自己的页面表示,页面刷新时可能会出现此问题,但这是应用程序逻辑的一个必要部分,因为到目前为止,它已经配置好了。