2014-02-09 44 views
2

我想在WebDriver中为页面对象创建某种代码生成。WebDriver的代码生成PageObjects

我读到它,并观看下一讲: http://www.youtube.com/watch?v=mSCFsUOgPpw

我也看到了一些工具,创建在我的应用程序的每个新页面一个页面对象,所以我知道如何识别和创建WebElement其相关对我来说(通过ID或XPath),并创建一个新的页面对象。

但我有2个主要问题:

  1. 我怎样才能知道如何与这些元素呢?其中一些需要点击,一些需要发送密钥,一些需要点击然后按下ENTER等。
  2. 导航 - 在我的测试代码中,我想浏览各个页面(这是关于Page模式的所有内容)。我如何知道我的页面对象之间的连接?
+0

我预见的问题是,它通常都会有相同的挫折作为记录和回放工具做。他们会产生可怕的选择器和垃圾代码,可以通过手工更好地完成。 – Arran

+0

@Arran您可以通过将每个元素的标记名称和该元素的所有属性生成为XPATH。 –

回答

5

为每个控件(widget = button,combobox,textfield,...)创建一个(可重用的)页面对象。小部件的构造函数接受WebElement或By对象。每个页面对象都应该使用可重用的页面对象。这是一个简单登录页面的例子。

public class MyLoginPage { 
    private TextField mUsername; 
    private TextField mPassword; 
    private Button mSignon; 

    ... 

    // getter 
    public TextField getUsername() { 
    return mUsername; 
    } 

} 

随着使用一些启发式,你应该能够选择正确的小部件来使用。这应该回答你的第一个问题。

对于第二个问题。 您可以在您的页面对象上实现特定的方法,以返回另一页面对象。类似的东西:

​​

你也可以实现按钮作为一个通用的类。 上的按钮组件的方法请点击:

public <T extends Widget> T click() { 
    ... // coe that makes the click 
    return new T(...); 
} 

登录页面内的成员声明:

private Button mSignon<MyHomePage>; 

所以你可以这样写:

MyHomePage hp = loginPage.getSignon().click(); 

要么你实现一个工厂页面目的。工厂能够确定屏幕的当前状态并返回与您所看到的页面目标相匹配的页面目标。您可以确定通过尝试在屏幕上找到某个特定元素(即,登录按钮仅存在于登录页面上)。

根本不是一个确定的答案,但我希望它已经给你指示。不要犹豫,在评论中发布一个问题,我会更新这个答案。

+0

谢谢你的回答。我有一个关于2的问题。在我的应用程序中,这个问题有很多问题。例如,当我点击其中一个复选框时,它会切换导致不同页面的另一个元素(//按钮)。我怎么能知道点击这个元素是改变这个按钮,并导致2个不同的测试(和逻辑..)。 –

+0

另外,按时间顺序:如果我需要按下OK,在开始sendKeys()之前,我怎么能通过DOM和selenuim知道它? –

+0

第一个问题:你可以有一个包含所有按钮的页面对象,不管它们是否可见。您必须在按钮的可重用页面对象上编写方法'isVisble'。您将拥有一个测试用例,您可以在其中测试该按钮的可见性,具体取决于是否勾选复选框,测试用例可在按钮可见时测试页面的细节,以及用于测试页面行为时的测试用例该按钮不可见。 – Algiz

2

我也受到这次讲座的启发,经过一段时间的探讨后,我会说:这种自动页面对象生成方法对于某些Web应用程序是可能的:例如,默认的重要控件。 NET/ASPX页面将具有id:ctxWebPageName_Container1_Panel1_btnLogin。
您可以轻松解析ID并获取所有必需的信息。

但是,在一般情况下,自动页面对象生成是不可能的或非常困难的,并且需要一些人工智能。

这就是为什么我建立了我自己的工具SWD Page Recorder半自动化这个手工创建页面对象类的无聊过程。
该工具允许:

  • 从浏览器页面添加新元素
  • 编辑和调试记录的web内容:测试和更改定位器
  • 生成页面对象的类文件

为了为了展示全貌,我正在研究另一个项目,一个带有PageObjects的简单框架:
SWD.Starter其中为PageObjects引入了以下规则:

每个页面可以是自测试:
没有为框架,它打开的页面,并要求PageObject自我测试其元件内的各PageObject一个通用的测试。这些测试是作为一个微小的烟雾测试套件实施的。首先,他们测试应用程序,但另一方面,他们还检查页面对象声明里面的代码是否仍然对应于真实页面。

面向服务架构
第一页的连接板元件不能Page1类外部访问。当测试代码或其他页面想要对Page1执行一些操作时,它们应该调用一个在Page1中声明的方法。 Page1中的所有Web元素都使用私有或受保护的修饰符声明。

通过遵循这些规则,我真的简化了我的生活:

  • SWD Page Recorder录制新页面,并生成PageObject代码变得更快,更有趣的过程。
  • 当PageObjects与实际页面不对应时,烟雾测试套件发生故障的速度很快。
  • 为了修复页面对象,我需要使用SWD Page Recorder手动重新录制一些元素,或者进行手动修改。正如我所说的,不允许直接使用给定PageObject之外的Web元素;因此修复只需要应用在破损的pageObject中。其他页面

参考