我正在研究selenium Page Factory模型。我需要以这样的方式概括xpath,它应该根据用户需求进行匹配。
让我们说我有跟随xpath
my $d = 'URLs.txt';
open(my $fh, '<:encoding(UTF-8)', $d)
#opendir(D, "$d") || die "Can't open directory $d: $!\n";
or die "Can't open directory $d: $!\n";
my @list = readdir($fh);
closedir($fh);
foreach my $f (@list) {
my $json_data = get "$f";
my $json_obj = new JSON;
my $URLdata = $json_obj->decode($json_data);
return $URLdata->{'status'} eq 'UP';
}
我需要根据用户输入将此xpath用于Store#44或Store#100或其他任何内容。
使用常规的旧方法findElementBy我能够实现这一目标。但我想知道页面工厂的概念我们可以实现吗?
由于
答案 0 :(得分:3)
我的一个项目有类似的用例。以下是我用过的内容:
public RadioElement getTemplates(String id) {
return createBaseElement(By.id("templateId")).createRadioElement(By.xpath("//input[contains(@value,'1')]"));
}
在上面的例子中: 1. ElementFactory.createBaseElement(By.id(&#34; lia-templateId&#34;)) //这是帮助定位它的子元素的父类,是一个最好的情况。使用也可以使用类似的用例,传递具有div / id / classname的父级的定位器。
<强> 2。 createRadioElement(By.xpath(&#34; //输入[contains(@value,&#39; 1&#39;)]&#34;)); //传递子类xpath详细信息我根据用户输入调用从函数传递值为动态值。
对于您的情况,您必须做一些类似的更改:
public RadioElement getTemplates(String id) {
@FindBy(xpath = "(//div[@class='del-hours' and contains(.,'Store #id')]//..//..//..//..//i)[2]")
WebElement selectStore;
}
尝试修改路径,因为路径似乎不适合您可以使用
(By.xpath("//div[contains(@class,'del-hours')]"))