【问题标题】:Pagefactory dynamic webelement with wildcard带有通配符的 Pagefactory 动态 web 元素
【发布时间】:2017-10-12 22:26:07
【问题描述】:

我动态生成的定位器取决于要从列表中选择哪个元素。

例如,这是我生成的 id:

Function:TableName:0:submenuAction

0 是计数器,表示从列表中选择第一个元素。计数器前后的所有字符串都不会改变,所以开头,包含xpath的方法不起作用。

我可以使用一些通配符吗 Function:TableName:{X}:submenuAction {x} 是整数。

我可以存储所选数量的元素,但是如何在 pagefactory 元素中使用此变量? driver.findelement 可能会因 staleElementException 而失败,这就是我想使用 PageFactory 的原因。

【问题讨论】:

  • 当您在更改页面的 DOM 状态后尝试访问任何元素时,通常会发生 stale element 错误。因此,如果您想使用任何元素,您应该立即获得参考,然后您可以执行任何操作。为了您更好地理解场景,我正在编写一些伪代码来触发陈旧元素错误。 1. 获取页面上任何元素的引用 (driver.findelement(....)) 2. 刷新页面 (driver.manage.navigate.refresh()) 3. 现在尝试单击该元素 (element.click ())--> 你会遇到 stale element 错误。

标签: java selenium selenium-webdriver pageobjects page-factory


【解决方案1】:

无论您传入什么,都可能必须是一个常量(例如 Java 中的 final static)才能在 PageFactory 注释中使用。

private final static int ITEM_INDEX = 2;

...

@FindBy(xpath="Function:TableName:"+ ITEM_INDEX + ":submenuAction")
private WebElement targetListItem;

除了评论中提到的一些过时检查策略之外,您可能还想尝试将所有这些动态标识的元素绑定到一个集合(例如List<WebElement>),然后索引:

@FindBy(xpath="...")
private List<WebElement> allListEntries;

...

private WebElement getTargetListEntry(int index) {
    return allListEntries.get(index);
}

【讨论】:

  • 问题是,它必须是一个常数。我不知道 for 循环之后的索引值。据我所知,不能以这种方式修改或初始化常量。有什么想法吗?
  • 啊,是的。如果您动态计算所需的索引,那么第二个示例(抓取该动态列表中的所有项目并编制索引)可能就是您需要做的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-20
  • 2017-08-19
  • 1970-01-01
  • 2020-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多