可以在Selenium中声明具有多个引用的元素吗?



在我当前的框架(Cucumber, Selenium webdriver, PageObject)中,我们声明元素如下

CreateProfile.java//文件名

public class CreateProfile {
private static final By FIRST_NAME = By.id("firstNmae");
private static final By LAST_NAME = By.id("lastNmae");
private static final By CLICK_SUBMIT = By.xpath(".//span[@title='{submit}']");
}

后面跟着输入和单击元素的方法。

我想传递一个以上的元素引用,像这样

private static final By CLICK_SUBMIT = By.xpath(".//span[@title='{form_submit}']") || By.id("submit") ;

如果我想传递以上相同元素的多个元素引用该怎么办?

您可以使用以下css selector.来标识元素

private static final By CLICK_SUBMIT = By.cssSelector("span[title='{form_submit}'],#submit");

您可以在Xpath中使用管道(|)使用'OR'逻辑:

private static final By CLICK_SUBMIT = By.xpath("//(span[@title='{form_submit}'] | *[@id='submit'])") 

如果你正在使用FindBy,你可能也想看到这个答案。

Selenium为这种情况提供了ByByAll实现。假设你有一个类与Bys:

class MyBys {
public static final By CLICK_SUBMIT_BY_TITLE = By.xpath(".//span[@title='{submit}']");
public static final By CLICK_SUBMIT_BY_ID = By.id("submit");
}

然后你可以这样做:

By mySuperBy = new ByAll(MyBys.CLICK_SUBMIT_BY_TITLE, MyBys.CLICK_SUBMIT_BY_ID);
driver.findElement(mySuperBy).click();

您正在寻找的是QAF作为备选定位器策略可用的。你可以参考这里类似的问题。代码如下所示:

//if my_ele_loc in properties file
driver.findElement("my_ele_loc").click();
//if my_ele_loc is declared in java
driver.findElement(my_ele_loc).click();

my_ele_loc既可以是定位器库外部代码,也可以是java代码。它看起来像:

#out side code in property file
my_ele_loc=['id=submit','xpath=.//span[@title='{form_submit}'']
//java code
public static final String my_ele_loc="['id=submit','xpath=.//span[@title='{form_submit}'']"

最新更新