我试图在WebDriver中为Page对象创建某种代码生成。
我读了这篇文章,看了下一节课:http://www.youtube.com/watch?v=mSCFsUOgPpw
我还看到了一些工具,这些工具为我的应用程序中的每个新页面创建一个页面对象,因此我知道如何识别和创建与我相关的WebElement (通过ID或XPath),并创建一个新的页面对象。
但我有两个主要问题:
发布于 2014-02-10 08:09:18
为每个小部件创建一个(可重用的)页面对象(widget=按钮、组合框、textfield、.)。小部件的构造函数接受WebElement或By对象。每个页面对象都应该使用可重用的页面对象。下面是一个简单的登录页面的示例。
public class MyLoginPage {
private TextField mUsername;
private TextField mPassword;
private Button mSignon;
...
// getter
public TextField getUsername() {
return mUsername;
}
}通过使用一些启发式方法,您应该能够选择要使用的正确小部件。这应该能回答你的第一个问题。
关于第二个问题。要么在页面对象上实现返回另一个页面对象的特定方法。就像这样:
public MyHomePage clickSignon() {
this.mSignon.click();
return new MyHomePage(...);
}还可以将按钮实现为泛型类。方法单击Button小部件:
public <T extends Widget> T click() {
... // coe that makes the click
return new T(...);
}登录页面中的成员声明:
private Button mSignon<MyHomePage>;所以你可以写:
MyHomePage hp = loginPage.getSignon().click();要么实现页面对象的工厂。工厂能够确定屏幕的当前状态,并返回与您看到的内容匹配的页面objct。您可以通过尝试在屏幕上找到某些特定元素(即登录按钮只出现在登录页面上)来确定这一点。
不是一个明确的答案,但我希望它已经给了你方向。不要犹豫,在评论中发布一个问题,我会更新这个答案。
发布于 2014-05-11 22:24:11
我也受到了这个讲座的启发,在对这个主题进行了一段时间的探索之后,我会说:这种自动生成页面对象的方法对于某些web应用程序是可能的:例如,.NET/ASPX页面上的默认重要控件将具有id: ctxWebPageName_Container1_Panel1_btnLogin。
您可以轻松地解析id并获取所有所需的信息。
然而,在一般情况下,自动生成页面对象是不可能或非常困难的,需要一些人工智能。
这就是为什么我构建了自己的工具社署网页记录器,用于半自动手动创建页面对象类的枯燥过程。
该工具允许:
为了显示全貌,我正在进行另一个项目,一个使用PageObjects的简单框架:
SWD.Starter,它为PageObjects引入了以下规则:
每个页面都可以进行自我测试:
框架中的每个PageObject都有一个通用测试,它打开页面并要求PageObject对其元素进行自我测试。
这些测试是作为一个小烟幕测试套件实现的。首先,他们测试应用程序,但另一方面,他们也检查页面对象声明内的代码仍然对应于真实的页面。
面向服务的体系结构
Page1的web元素不能在Page1类之外访问。当测试代码或其他页面想在Page1上执行一些操作时,他们应该调用在Page1中声明的方法。Page1中的所有web元素都是用私有或受保护的修饰符声明的。
通过遵循这些规则,我简化了我的生活:
参考资料
https://stackoverflow.com/questions/21661320
复制相似问题