我有一個帶有鍵值對的組態檔,
language = "IN"
并且我有多個名稱為 as 的頁面物件列舉檔案
PageObject_US,PageObject_UK,PageObject_IN
每個頁面物件列舉檔案都有可以使用例如訪問的常量
PageObjects_US.String.lable
但我想要實作的是一種創建如下內容的方法
- 從組態檔中獲取引數,將其存盤在字串中,例如 String language = "IN"
- 然后使用“PageObjects_” 語言連接得到(PageObjects_IN)
- 以便回傳值可用于從 PageObjects_IN.String.label 中獲取常量。
以下是代碼塊:
if(!ENV.equalsIgnoreCase("development") && VALIDATION.equalsIgnoreCase("yes")) {
Elements.ByTitle(webDriver,PageObjects_IN.GREAT.label);
Elements.ByID(webDriver, PageObjects_IN.COUNTER.label);
}
在上面我想在運行時使用列舉檔案 PageObjects_IN 因為我有很多列舉檔案
下面是列舉
public enum PageObjects_IN {
// Text
GREAT("great"),
COUNTER("counter");
public final String lable;
PageObjects_IN(final String lable) {
this.lable = lable;
}
}
uj5u.com熱心網友回復:
這是可能的(使用反射),但強烈不建議這樣做,因為它會降低 Java 語言結構的效率。
不推薦的方式
假設您有一個包裹click.webelement.cucumber.po存放在哪里
public enum PO_EN {
GREAT("great_en"),
COUNTER("counter_en");
public final String label;
PO_EN(String label){
this.label = label;
}
}
和
public enum PO_IN {
GREAT("great_in"),
COUNTER("counter_in");
public final String label;
PO_IN(String label){
this.label = label;
}
}
然后要取一個值,您可以執行以下操作:
String lang = "EN";
// Take class
Class clazz = Class.forName("click.webelement.cucumber.po.PO_" lang);
// Find an object that represent enum constant
Object val = Arrays
.stream(clazz.getEnumConstants()).filter(o -> "GREAT".equals(o.toString()))
.findAny()
.get();
// Take field value for that object
Field f = clazz.getField("label");
System.out.println(f.get(val));
這是容易出錯的方法,您不會從編譯階段受益。
推薦的方法 - 1
而不是enum使用類。
public abstract class PO {
public abstract String great();
public abstract String counter();
}
和
public class PO_EN extends PO{
@Override
public String great() {
return "great_en";
}
@Override
public String counter() {
return "counter_en";
}
}
和
public class PO_IN extends PO{
@Override
public String great() {
return "great_in";
}
@Override
public String counter() {
return "counter_in";
}
}
所以你的測驗會簡單得多
String lang = "EN";
Class clazz = Class.forName("click.webelement.cucumber.po.PO_" lang);
PO val = (PO) clazz.getDeclaredConstructor().newInstance();
System.out.println(val.great());
推薦的方法 - 2
您可以將 PageFactory 工具用于您的頁面物件并使用此庫來引數化您的定位器,例如(如果您使用測驗 ng):
@DataProvider(name = "languages")
Object[][] dataProvider(){
return new Object[][]{
{"en", "great_en", "counter_en"},
{"in", "great_in", "counter_in"}
};
}
@Test(dataProvider = "languages")
public void testPage(String language, String great, String counter){
DefaultParameterProvider
.properties
.set(Map.of("p.great", great, "p.counter", counter));
MyPage myPage = new MyPage(driver);
...
}
您的頁面將是這樣的:
public class MyPage extends PageObjectParameterized {
@FindByParameterized(xpath = "//button[@name='{wec:p.great}']")
WebElement great;
@FindByParameterized(xpath = "//label[text()='{wec:p.counter}']")
WebElement counter;
@FindBy(xpath = "//input")
WebElement input;
public MyPage(SearchContext searchContext) {
super(searchContext);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/433116.html
