[英]Designing page object structure for selenium tests. Inheriting from WebElement causing problems
我正在嘗試設計一些頁面對象,但總體設計存在一些問題。
我知道測試中的一個常見問題是弄清楚某個元素是否存在,解決方案是使用try / catch或使用findElements(...)並斷言結果列表的大小是否為0。
我想在所有測試中避免這些嘗試/嘗試。 是否可以使用繼承將try / catch放在超類中,從而使測試更簡潔? 我希望該方法在元素不存在的情況下返回null,那么我可以在測試中使用assertNotNull(...)。
這是我當前解決方案中來自頁面對象的方法:
public WebElement getRegisterLink(){
List<WebElement> list = driver.findElements(By.linktext("Register"));
if(list.size() == 0){
return null;
}
return list.get(0);
}
問題是存在很多類似的重復代碼。 我的getLoginButton(),getSomePageLink()等看起來相同。
這是我有的一個主意...
public abstract class MyCompanyElement implements WebElement{
WebElement element;
public MyCompanyElement(WebElement element){
this.element = element;
}
@Override
public void clear() {
element.clear();
}
@Override
public void click() {
element.click();
}
@Override
public MyCompanyElement findElement(By arg0) {
try{
MyCompanyElement e = (MyCompanyElement) element.findElement(arg0);
return e;
} catch (NoSuchElementException ex){
return null;
}
}
@Override
public List<MyCompanyElement> findElements(By arg0) {
List<MyCompanyElement> list = new ArrayList<MyCompanyElement>();
for(WebElement e : element.findElements(arg0)){
list.add((MyCompanyElement) e);
}
return list;
}
//Rest of the methods here which just call the methods of element
}
然后,我有了一個BasePage類,所有頁面對象都將擴展。
public abstract class BasePage {
MyCompanyElement element;
public BasePage(WebDriver driver){
element = (MyCompanyElement) driver.findElement(By.tagName("html"));
}
//More methods here
}
然后,頁面對象具有getLoginButton(),getRegisterLink()等方法,這些方法返回MyCompanyElement而不是WebElement。 (基准包含所有網頁上都存在的元素,例如頁眉和頁腳)。
我的測試可能如下所示:
Homepage homepage = new Homepage(driver);
homepage.getLoginButton().click();
如果我想檢查元素是否存在,那么...
assertNotNull(homepage.getRegisterLink());
上述解決方案的問題是:
謝謝
我想說,你有點過分了。 您無需創建自己的WebElement
版本。
您應該做的是在基類中放置一個接受給定By
,例如:
public WebElement getFirstMatchingElement(By by)
{
List<WebElement> list = driver.findElements(by);
if(list.size() == 0) {
return null;
}
return list.get(0);
}
然后,它足夠通用,可以像這樣調用它。
public WebElement getRegisterLink() {
return getFirstMatchingElement(By.linktext("Register"));
}
就像...
public WebElement getLoginButton() {
return getFirstMatchingElement(By.id("loginButton"));
}
這可以通過將代碼抽象為其他方法來解決您的問題,這意味着您的調用者(即,您實際在哪里找到元素)更加簡潔,簡單,並且無需“了解”所有“列出的內容”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.