首页 > 解决方案 > 如何将多个组件 (WebElements) 包装成一个组件?组件对象模型和页面对象模型

问题描述

我正在为基于 Angular.io 的 Web 应用程序开发测试。我正在用 Java 编写,我正在使用 Selenium (WebDriver)。我使用 Selenium 的 PageFactory 类遵循页面对象模型。由于我有一些非常复杂和嵌套的页面,我想从页面中获取某些组件(如嵌套 div)并将其包装在单个 WebElement / 自定义对象中。我认为这被称为组件对象模式。

让我们保持简单和通用。假设我有这个 html 页面:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
  </head>
  <body>
      <div class="list">
          <div class="element">
              <div class="country">France</div>
              <div class="capital">Paris</div>
          </div>
          <div class="element">
              <div class="country">Norway</div>
              <div class="capital">Oslo</div>
          </div>
          <div class="element">
              <div class="country">United Kingdom</div>
              <div class="capital">London</div>
          </div>
          <!-- ... -->
      </div>
  </body>
</html>

遵循页面对象模式并使用 Selenium 提供的 Pagefactory 类,我有这个代表页面的类:

import thisClass;
import thatClass;

public class ListPage {
    ChromeDriver driver;
    
    public ListPage(ChromeDriver) {
        PageFactory.initElements(driver, this);
        this.driver = driver;
    }

    @FindAll(@FindBy(how = How.XPATH, using = "//div[@class = 'element']"))
    private List<WebElement> elements;

    @FindAll(@FindBy(how = How.XPATH, using = "//div[@class = 'country']"))
    private List<WebElement> countrys;

    @FindAll(@FindBy(how = How.XPATH, using = "//div[@class = 'capital']"))
    private List<WebElement> capitals;
}

有没有办法可以定义类“元素”,例如:

class Element {
    public WebElement country;
    public WebElement capital;

    Element(WebElement country, WebElement capital) {
        this.country = country;
        this.capital = capital;
    }
}

并转换private List<WebElement> elements;private List<Element> elements;这样我就可以省略“国家”和“首都”?这种方式我将不得不打电话elements.get(index).country.getText()或什么的。

如果可能的话,这将对我有很大帮助。

标签: javaseleniumselenium-webdriverselenium-chromedriverpage-factory

解决方案


推荐阅读