如何在Selenium WebDriver中获取相对于另一个页面对象的页面对象

时间:2015-03-29 17:27:10

标签: selenium-webdriver

我正在寻找解决方案如何在页面对象模型中为selenium webdriver获取相对于另一个对象的页面对象

我的测试代码:

class StartPage {

    WebDriver driver;

    public HomePage(driver) {
        this.driver = driver;
    }

    @FindBy(xpath="//div[@class='widget']//a[text()='link text']")
    WebElement linkInWidget;

    public void clickLink() {
        linkInWidget.click();
        return PageFactory.initElements(driver, NextPage.class);

    }

 }

下一页

class NextPage {

    WebDriver driver;

    public HomePage(driver) {
        this.driver = driver;
    }

    @FindBy(xpath="//div[@class='widget']//input[@type='button']")
    WebElement buttonInWidget;

    @FindBy(id = "Index")
    WebElement index;

    public void clickButton() {
        buttonInWidget.click();
        return PageFactory.initElements(driver, NextPage.class);

    }

    public String getText() {
        return index.getText();                 
   }

 }

配置类

public class ConfigureTest{

   protected WebDriver driver;
   protected String baseUrl;
   protected StartPage startPage;
   protected NextPage nextPage ;

   @BeforeSuite
   public void setUp() {
         baseUrl = "http://webapp.com/";
         driver = new FirefoxDriver();
         driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

   }


   @AfterSuite
   public void tearDown() throws Exception {
         driver.quit();

   }
}

我的测试课程

public class SomeTest extends ConfigureTest {

   @Test
   public void testLinkAndButton() throws Exception {

          startPage = PageFactory.initElements(driver, SomePage.class);
          driver.get(baseUrl);

          nextPage = startPage.clickLink();
          nextPage.clickButton();
          String data = nextPage.getText();

   }
}

在FirstPage和NextPage这两个类中,我通过xpath找到具有相同第一部分 // div [@class =' widget'] 的元素,这意味着所有元素如按钮和链接在这个小部件下,我的所有页面中的小部件都有相同的xpath

问题:如果我的小部件的xpath只会被更改,我必须在我的测试的所有页面对象中进行更改

问题:以任何方式改进我的测试以获得更多灵活性,例如:

page().get(Widget.class, "Widget name").get(Button.class, "Button name").click

更新:我以这种方式解决了部分问题: 我使用get方法创建我的UI元素的类,这些方法可以返回任何类的对象:

Widget对象类

public class widget{
    WebDriver driver;

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

    // Find a single element
    @FindBy(xpath="//div[@class='tsf-p']")
    WebElement linkInWidget;

    public void click() {
        linkInWidget.click();
    }

    public <T> T get(Class<T> expectedPage, String uiclass){
        return PageFactory.initElements(driver, expectedPage);
    }


}

Button对象类

public class Button {
    WebDriver driver;

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

    @FindBy(name="btnG")
    WebElement button;

    public void click() {
        button.click();
    }

    public <T> T get(Class<T> expectedPage){
        return PageFactory.initElements(driver, expectedPage);
    }


}

主页类

public class HomePage {
    WebDriver driver;

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

    @FindBy(xpath="//div[@class='widget']//a[text()='']")
    WebElement linkInWidget;

    public void click() {
        linkInWidget.click();
    }

    public <T> T get(Class<T> expectedPage, String name){

        return PageFactory.initElements(driver, expectedPage);
    }

}

我的测试

public class searchTest {
    WebDriver driver;

    @BeforeTest
    public void setup() {
        driver = new FirefoxDriver();
        driver.get("https://www.google.com.ua/");
    }

    @Test
    public void testUI() {
        HomePage homePage = PageFactory.initElements(driver, HomePage.class);
        widget widget = PageFactory.initElements(driver, widget.class);

        homePage.get(widget.class).get(Input.class).setValue("yahoo");
        homePage.get(widget.class).get(Button.class).click();

   }

}

结果是我们可以通过使用我们的类

来组合任何对象
homePage.get(widget.class).get(Input.class).setValue("yahoo");

如何通过名称或数字获取元素,例如:

homePage.get(widget.class, "Name").get(Input.class, 1).setValue("yahoo");

1 个答案:

答案 0 :(得分:2)

我有一个公共存储库here,我在其中使用PageFactory实现了PageObject和TestNG概念。您可能正在寻找更好的方法来继承BaseClasse。常用方法应放在BaseClass中,并通过继承可用于所有PageObjects。我把所有东西放在GitHub中,而且它太宽泛了,无法在这里实现。