一尘不染

扩展Selenium WebDriver WebElement?

selenium

我遵循Selenium建议的Page
Object模式,但是如何为页面创建更专业的WebElement。具体来说,我们在页面上有表格,并且我编写了一些帮助函数来获取表格的特定行,返回表格的内容等。

当前,这是我创建的具有表格的页面对象的片段:

public class PermissionsPage  {

    @FindBy(id = "studyPermissionsTable")
    private WebElement permissionTable;

    @FindBy(id = "studyPermissionAddPermission")
    private WebElement addPermissionButton;

    ...

}

因此,我想做的就是让该PermissionsTable成为一个更自定义的WebElement,其中包含我前面提到的一些方法。

例如:

public class TableWebElement extends WebElement {
    WebElement table;
    // a WebDriver needs to come into play here too I think

    public List<Map<String, String>> getTableData() {
        // code to do this
    }

    public int getTableSize() {
        // code to do this
    }

    public WebElement getElementFromTable(String id) {
        // code to do this
    }
}

我希望这是我要解释的意思。我猜我正在寻找的是一种使此自定义WebElement能够执行某些特定于表的其他方式的方法。将此自定义元素添加到页面,并利用Selenium基于注释将Webelements连接到页面的方式。

可能吗?如果是这样,有谁知道该怎么做?


阅读 236

收藏
2020-06-26

共1个答案

一尘不染

我创建了一个结合了所有WebDriver接口的接口:

public interface Element extends WebElement, WrapsElement, Locatable {}

它只是包装了WebElement在包装元素时可以做的所有事情。

然后是一个实现:

public class ElementImpl implements Element {

    private final WebElement element;

    public ElementImpl(final WebElement element) {
        this.element = element;
    }

    @Override
    public void click() {
        element.click();
    }

    @Override
    public void sendKeys(CharSequence... keysToSend) {
        element.sendKeys(keysToSend);
    }

    // And so on, delegates all the way down...

}

然后,例如,一个复选框:

public class CheckBox extends ElementImpl {

    public CheckBox(WebElement element) {
        super(element);
    }

    public void toggle() {
        getWrappedElement().click();
    }

    public void check() {
        if (!isChecked()) {
            toggle();
        }
    }

    public void uncheck() {
        if (isChecked()) {
            toggle();
        }
    }

    public boolean isChecked() {
        return getWrappedElement().isSelected();
    }
}

在脚本中使用它时:

CheckBox cb = new CheckBox(element);
cb.uncheck();

我还想出了一种包装Element类的方法。您必须创建一些工厂来替换内置的PageFactory,但这是可行的,并且具有很大的灵活性。

我已经在我的网站上记录了此过程:

我还有一个名为selophane的项目,该项目受到以下问题的启发:selophane

2020-06-26