2016-11-10 101 views
1

基於硒的測試中最流行的模式之一是頁面對象。不幸的是,如果我們按原樣使用它,我們經常需要複製代碼。考慮以下情況:組件對象代替硒中的頁面對象

  • 我們使用UI框架,共同組成,說一些花式球檯
  • 表是相當複雜的,具有過濾,排序,搜索
  • 該表上的幾頁中使用應用程序

是否有任何現有的基礎結構可以創建更多的粒狀組件對象而不是頁面對象,無論是在硒中還是在第三方lbirary中?我的意思是,註釋和相關的基礎設施?

回答

2

作爲selenium webdriver的移動實現的Appium具有widget對象的概念,它是pageobjects的擴展。有一個Widget類可以讓你搜索相關的元素,包括在Web瀏覽器中。你可以在appium source test部分查看。看看包io.appium.java_client.pagefactory_tests.widgets。這支持FindBy註釋和WebElement構造和PageFactory初始化。

因此,而不是使用

@FindBy(.......) 
private WebElement myTable; 

可以使用

@FindBy(container of the table....) 
private Table myTable; 

表類現在可以擁有所有相關變量和方法。

部分的pom.xml的

<dependency> 
    <groupId>org.seleniumhq.selenium</groupId> 
    <artifactId>selenium-api</artifactId> 
    <version>2.53.1</version> 
</dependency> 
<dependency> 
    <groupId>io.appium</groupId> 
    <artifactId>java-client</artifactId> 
    <version>4.1.2</version> 
</dependency> 

測試類 -

import io.appium.java_client.pagefactory.AppiumFieldDecorator; 

import org.junit.Test; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.chrome.ChromeDriver; 
import org.openqa.selenium.support.PageFactory; 

public class WidgetBrowTest { 

    @Test 
    public void test() { 
     System.setProperty("webdriver.chrome.driver", "E:/Software Testing/Selenium/Jars/chromedriver.exe"); 

     WebDriver driver = new ChromeDriver(); 

     driver.get("http://stackoverflow.com/"); 


     SOHome soHome = new SOHome(driver); 
     PageFactory.initElements(new AppiumFieldDecorator(driver), soHome); 

     //Below two are from widget - First question in stackoverflow homepage 
     System.out.println(soHome.getFirstQues().getQuesTitle()); 
     System.out.println(soHome.getFirstQues().getQuesTags()); 

     //Below two are from home page 
     System.out.println(soHome.getLogoText()); 
     System.out.println(soHome.getMenuText()); 
    } 
} 

StackOverflow的主頁 -

import java.util.List; 
import java.util.stream.Collectors; 

import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.WebElement; 
import org.openqa.selenium.support.FindBy; 

public class SOHome { 

    @FindBy(css="div[id='hlogo'] > a") 
    private WebElement logo; 

    @FindBy(xpath="//div[@id='hmenus']//li/a") 
    private List<WebElement> menuOpt; 

    @FindBy(css="div[class='summary']") 
    private SOQuesWidget firstQues; 

    private WebDriver driver; 


    public SOHome(WebDriver driver) { 
     this.driver = driver; 
    } 

    public String getLogoText() { 
     return logo.getText(); 
    } 

    public List<String> getMenuText() { 
     return menuOpt.stream().map(t -> t.getText()).collect(Collectors.toList()); 
    } 

    public SOQuesWidget getFirstQues() { 
     return firstQues; 
    } 
} 

問題的Widget - 首先問

import java.util.List; 
import java.util.stream.Collectors; 

import org.openqa.selenium.WebElement; 
import org.openqa.selenium.support.FindBy; 

import io.appium.java_client.pagefactory.Widget; 

public class SOQuesWidget extends Widget { 

    @FindBy(css="a[class='question-hyperlink']") 
    private WebElement quesTitle; 

    @FindBy(xpath=".//div[starts-with(@class,'tags')]/a") 
    private List<WebElement> quesTags; 

    protected SOQuesWidget(WebElement element) { 
     super(element); 
    } 

    public String getQuesTitle() { 
     return quesTitle.getText(); 
    } 

    public List<String> getQuesTags() { 
     return quesTags.stream().map(t -> t.getText()).collect(Collectors.toList()); 
    } 
} 
+0

據我所知,它只適用於移動設備。有這樣的桌面工具嗎? –

+0

使用封裝第一個問題的功能的小部件查看爲堆棧溢出主頁添加的代碼部分... – Grasshopper

+0

非常感謝。這就是我想要的。 –

1

頁面對象有點用詞不當。他們不必特別整頁來跟隨頁面對象模型。我將創建一個Table類(頁面對象),其中包含Table對象的所有定位器和方法,然後將其包含在它出現的頁面/頁面對象中。

例如,如果主頁包含表格對象,那麼HomePage類將引用Table類。

+0

當我初始化頁面時,所有選擇器都是相對於根文檔。我想讓它們相對於某個元素應用,以便我可以「解析」表格。 –

+0

是否沒有辦法唯一標識表格內的表格,例如該表有ID或其他方式來標識'TABLE'標籤?我不認爲你可以給我一個示例頁面的鏈接,或者至少爲表格提供一些相關的HTML?也許我可以幫忙找到一種方法。 – JeffC

+0

這個表格是一個假設的例子,用於說明我想要更多地重用代碼的情況。基本上,我有一個元素,並希望它的工作方式允許我使用相對於它的FindBy註釋或以其他方式執行註釋。 –