当前位置: 首页 > 知识库问答 >
问题:

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

濮阳俊明
2023-03-14

我正在寻找解决方案,如何在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找到元素,xpath具有相同的第一部分//div[@class='widget'],这意味着所有元素(如按钮和链接)都在这个小部件下,我在我的所有页面中都有相同的小部件xpath

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

问题:如何改进我的测试以提高使用的灵活性,如:

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

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

控件对象的类

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);
    }


}

按钮对象的类

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个答案

司寇安宜
2023-03-14

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

 类似资料:
  • 有没有办法像这样通过名称或数字返回页面对象: 我用get方法创建我的UI元素(小部件、输入)的类,它可以返回任何类的对象 小部件的类别 按钮对象的类 主页类别 我的测试 结果是我们可以通过使用我们的类来组合任何对象 问题:我的xpath是动态的,应该包含名称 如何使用如下构造返回具有特定名称的新对象: 有什么想法吗?

  • 本章是一个针对页面对象设计模式的教程引导。 一个页面对象表示在你测试的WEB应用程序的用户界面上的区域。 使用页面对象模式的好处: 创建可复用的代码以便于在多个测试用例间共享 减少重复的代码量 如果用户界面变化,只需要修改一处 6.1. 测试用例 下面是一个在python.org网站搜索一个词并保证一些结果可以找到的测试用例。 import unittest from selenium impor

  • 我有一个关于selenium WebDriver中页面对象的问题。我们的站点非常动态,有很多ajax和各种身份验证状态。如何定义每个页面对象,但让我们假设我已经弄清楚了,并定义了代表我们站点的几个页面对象。 你如何处理从一页到另一页的交叉?因此,我得到一个页面对象用于我的主页,一个用于我的帐户页面,一个用于我的结果页面。然后我需要编写一个遍历我所有页面的测试来模拟一个用户执行多个动作。

  • 人们是如何做到这一点的? 谢谢

  • 问题内容: 我想为FIFA2014世界杯比赛创建一个警报应用程序,在该应用程序中我有一个服务器,用于在巴西/英亩存储比赛的日期和时间,并且我的客户端是android应用程序,而android设备可能具有任何可能的时区所以我的问题是我想将巴西/英亩的时间转换为具有不同时区的本地android设备的时间,经过大量的谷歌搜索后,我开始了解joda数据和时间库,但是在android中它太慢了,所以请提出任

  • 原因是:groovy.lang.MissingPropertyException:无法将tile1解析为Pages.LoginPage的内容或导航器上下文中的属性。tile1是您忘记导入的类吗? 它在loginPage中寻找tile1,而不是主页。