我遵循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连接到页面的方式。
可能吗?如果是这样,有谁知道该怎么做?
我创建了一个结合了所有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,但这是可行的,并且具有很大的灵活性。
Element
PageFactory
我已经在我的网站上记录了此过程:
我还有一个名为selophane的项目,该项目受到以下问题的启发:selophane