Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带有通配符的Pagefactory动态webelement_Java_Selenium_Selenium Webdriver_Pageobjects_Page Factory - Fatal编程技术网

Java 带有通配符的Pagefactory动态webelement

Java 带有通配符的Pagefactory动态webelement,java,selenium,selenium-webdriver,pageobjects,page-factory,Java,Selenium,Selenium Webdriver,Pageobjects,Page Factory,我动态生成的定位器取决于从列表中选择哪个元素 例如,这是我生成的id: Function:TableName:0:submenuAction 0是计数器,表示从列表中选择第一个元素。计数器前后的所有字符串都不会更改,因此从开始,contains xpath方法不起作用 我能用一些通配符吗 函数:TableName:{X}:子菜单{X}是整数 我可以存储所选数量的元素,但如何在pagefactory元素中使用此变量?driver.findelement可能会因staleElementExcept

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

例如,这是我生成的id:

Function:TableName:0:submenuAction
0是计数器,表示从列表中选择第一个元素。计数器前后的所有字符串都不会更改,因此从开始,contains xpath方法不起作用

我能用一些通配符吗
函数:TableName:{X}:子菜单
{X}是整数


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

无论您传入什么,都可能必须是常量(例如Java中的
最终静态
)才能在
PageFactory
注释中使用

private final static int ITEM_INDEX = 2;

...

@FindBy(xpath="Function:TableName:"+ ITEM_INDEX + ":submenuAction")
private WebElement targetListItem;
除了注释中提到的一些过时的检查策略外,您可能还希望尝试将所有这些动态标识的元素绑定到集合(例如,
列表
),然后索引:

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

...

private WebElement getTargetListEntry(int index) {
    return allListEntries.get(index);
}
@FindBy(xpath=“…”)
私有列表所有列表项;
...
私有WebElement getTargetListEntry(int索引){
返回allListEntries.get(索引);
}

无论您传入什么,都可能必须是一个常量(例如Java中的
最终静态
),才能在
页面工厂
注释中使用

private final static int ITEM_INDEX = 2;

...

@FindBy(xpath="Function:TableName:"+ ITEM_INDEX + ":submenuAction")
private WebElement targetListItem;
除了注释中提到的一些过时的检查策略外,您可能还希望尝试将所有这些动态标识的元素绑定到集合(例如,
列表
),然后索引:

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

...

private WebElement getTargetListEntry(int index) {
    return allListEntries.get(index);
}
@FindBy(xpath=“…”)
私有列表所有列表项;
...
私有WebElement getTargetListEntry(int索引){
返回allListEntries.get(索引);
}

在更改页面的DOM状态后尝试访问任何元素时,通常会发生过时元素错误。因此,如果您想使用任何元素,您应该立即获得引用,然后可以执行任何操作。为了更好地理解这个场景,我编写了一些用于触发stale元素错误的伪代码。1.获取页面上任何元素的引用(driver.findelement(..)2。刷新页面(driver.manage.navigate.refresh())3。现在尝试单击该元素(element.click())-->您将遇到陈旧元素错误。通常,在更改页面的DOM状态后尝试访问任何元素时,都会发生陈旧元素错误。因此,如果您想使用任何元素,您应该立即获得引用,然后可以执行任何操作。为了更好地理解这个场景,我编写了一些用于触发stale元素错误的伪代码。1.获取页面上任何元素的引用(driver.findelement(..)2。刷新页面(driver.manage.navigate.refresh())3。现在尝试单击该元素(element.click())-->您将遇到陈旧元素错误。问题是,它必须是常量。我不知道for循环之后的索引值。据我所知,常量不能以这种方式修改或初始化。知道吗?啊,知道。如果您动态计算所需的索引,那么第二个示例(获取动态列表中的所有项目并在中建立索引)可能就是您需要做的事情。问题是,它必须是一个常量。我不知道for循环之后的索引值。据我所知,常量不能以这种方式修改或初始化。知道吗?啊,知道。如果您动态地计算所需的索引,那么第二个示例(获取动态列表中的所有项目并在中建立索引)可能就是您需要做的事情。