扩展Selenium WebDriver WebElement?

pip*_*upp 13 java selenium webdriver

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

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

public class PermissionsPage  {

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

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

    ... 

}
Run Code Online (Sandbox Code Playgroud)

所以,我想要做的是将权限表作为一个更加自定义的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
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望这是有道理的,我正在努力解释.我想我正在寻找的是让这个自定义WebElement做一些特定于表的其他东西的方法.将此自定义元素添加到页面,并利用Selenium基于注释将webelements连接到页面的方式.

可能吗?如果是这样,有谁知道如何做到这一点?

Eli*_*ver 28

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

public interface Element extends WebElement, WrapsElement, Locatable {}
Run Code Online (Sandbox Code Playgroud)

它就是包装WebElements在包装元素时可以做的所有事情.

然后是一个实现:

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...

}
Run Code Online (Sandbox Code Playgroud)

然后,例如一个复选框:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的脚本中使用它时:

CheckBox cb = new CheckBox(element);
cb.uncheck();
Run Code Online (Sandbox Code Playgroud)

我也提出了一种包装Element课程的方法.你必须创建一些工厂来替换内置的PageFactory,但它是可行的,它提供了很大的灵活性.

我在我的网站上记录了这个过程:

我还有一个名为selophane的项目受到了这个和其他问题的启发:selophane