标签: pageobjects

页面对象模型:为什么不在页面方法中包含断言?

第一次海报.我已经在UI自动化领域工作了很多年,但最近才引入/指示使用Page Object Model.其中大部分是常识,包括我已经使用的技术,但有一个特别好的点我无法在自己的脑海中证明,尽管广泛搜索了一个合理的解释.我希望这里有人可以启发我,因为这个问题引起了一些惊愕,因为我试图将POM与我自己的最佳实践相结合.

来自http://code.google.com/p/selenium/wiki/PageObjects:

上面给出的代码显示了一个重要的观点:测试而不是PageObjects应该负责对页面状态进行断言....当然,正如每个指南都有例外......

来自http://seleniumhq.org/docs/06_test_design_considerations.html#chapter06-reference:

在如何设计页面对象方面有很多灵活性,但是有一些基本规则可以获得测试代码所需的可维护性.页面对象本身永远不应该进行验证或断言.这是测试的一部分,应该始终在测试代码中,而不是在页面对象中.页面对象将包含页面的表示形式,以及页面通过方法提供的服务,但是没有与正在测试的内容相关的代码应该在页面对象中.

有一个单一的验证可以而且应该在页面对象中,即验证页面以及页面上可能的关键元素是否已正确加载.应在实例化页面对象时完成此验证.

这两个"指南"都允许潜在的例外,但我对基本前提不能不同意.我习惯于在"页面方法"中进行大量的验证,我认为验证的存在是一种强大的技术,可以在各种环境中查找问题(即每次调用方法时都会进行验证)而不仅仅发生在特定测试的有限环境中.

例如,让我们想象一下,当您登录AUT时,会出现一些文本"以USER身份登录".有一个测试专门验证这个是合适的,但为什么不想在每次调用登录时验证它?这个工件与页面"是否正确加载"没有直接关系,并且它与"正在测试的内容"无关,因此根据上面的POM指南,它显然不应该是页面方法. ..但在我看来,它显然应该存在,通过尽可能经常地验证重要的工件来最大化自动化的力量,尽可能少的事先考虑.将验证码放入页面方法可以增加自动化的功能,允许您"免费"获得大量验证,而不必在测试中担心,并且在不同的环境中进行频繁验证通常会发现您不会发现的问题如果验证仅限于对该工件的单个测试.

换句话说,我倾向于区分特定于测试的验证和"一般"验证,并且我认为后者被广泛地包含在页面方法中是完全合适/可取的.这促进了更薄的测试和更厚的页面对象,这通常通过重用更多代码来提高测试可维护性 - 尽管这些指南中存在相反的争用.我错过了这一点吗?不希望在页面方法中进行验证的真正原理是什么?我所描述的情况实际上是这些指南中描述的"例外"之一,因此实际上与POM不一致吗?提前感谢您的想法.-jn-

ruby selenium webdriver pageobjects selenium-webdriver

34
推荐指数
4
解决办法
7718
查看次数

Codeception,使用pageObject设计模式和小黄瓜编写验收测试

我正在寻找一个带有pageObject设计模式和小黄瓜的代码的简单示例,因为当我遵循代码生成BDD文档时,所有示例都在tests/support/AcceptanceTester.php中编写.我不明白(英语技能差 - - )如何不将所有代码集中在AcceptanceTester.php文件中.

例如,我有一个带有两个按钮A和B的示例主页.如果用户单击按钮A,则加载页面A,否则如果用户单击按钮B,则加载页面B.

目前,我的AcceptanceTester:

<?php
// tests/_support/AcceptanceTester.php
/**
 * Inherited Methods
 * @method void wantToTest($text)
 * @method void wantTo($text)
 * @method void execute($callable)
 * @method void expectTo($prediction)
 * @method void expect($prediction)
 * @method void amGoingTo($argumentation)
 * @method void am($role)
 * @method void lookForwardTo($achieveValue)
 * @method void comment($description)
 * @method \Codeception\Lib\Friend haveFriend($name, $actorClass = NULL)
 *
 * @SuppressWarnings(PHPMD)
 */

class AcceptanceTester extends \Codeception\Actor
{
    use _generated\AcceptanceTesterActions;

    /**
     * @Given The home …
Run Code Online (Sandbox Code Playgroud)

php gherkin pageobjects codeception

34
推荐指数
1
解决办法
780
查看次数

Pythonic方法解决循环导入语句?

我只是继承了一些让我感到不安的代码:有一个测试库,其中包含与我们网站上的网页相对应的类,每个网页类都有自动化该页面功能的方法.

有一些方法可以单击页面之间的链接,返回链接页面的类.这是一个简化的例子:

文件homePageLib.py:

class HomePage(object):
    def clickCalendarLink(self):
        # Click page2 link which navigates browswer to page2
        print "Click Calendar link"
        # Then returns the page2 object
        from calendarLib import CalendarPage
        return CalendarPage()
Run Code Online (Sandbox Code Playgroud)

文件calendarLib.py:

class CalendarPage(object):
    def clickHomePageLink(self):
        # Click page1 link which navigates browswer to page1
        print "Click Home Page link"
        # Then return the page2 object
        from homePageLib import HomePage
        return HomePage()
Run Code Online (Sandbox Code Playgroud)

然后,这允许脚本文件单击页面并将该对象作为该方法的返回值,这意味着脚本作者不必在浏览站点时保持实例化新页面.(我觉得这是一个奇怪的设计,但我不能完全理解为什么,除此之外,有一个名为'clickSomeLink'的方法并返回结果页面的对象似乎很奇怪.)

以下脚本说明了脚本如何在站点中导航:(我插入print page以显示页面对象如何更改)

脚本文件:

from homePageLib import HomePage

page = HomePage()    
print page
page = …
Run Code Online (Sandbox Code Playgroud)

python pageobjects

33
推荐指数
2
解决办法
2万
查看次数

Selenium WebDriver中的页面对象模式是什么?

Selenium WebDriver中的页面对象模式是什么?

它的用途是什么?我们如何在Selenium WebDriver中使用它?

例子将不胜感激.

selenium design-patterns pageobjects selenium-webdriver

33
推荐指数
1
解决办法
6万
查看次数

使用Selenium PageObject设计模式的最佳方法是什么

我正在使用Selenium 2 Web Driver和C#.Net创建测试.在阅读了很多Selenium文档之后,我仍然不确定如何使用PageObject设计模式进行测试.

许多selenium示例仅在Java中显示,并且.Net的API绑定并不总是与人们认为的由于限制和某些语言设置的标准相似.

在.Net Selenium Web Driver中将PageObject设计模式与PageFactory一起使用的最佳方法是什么?

最终,我希望我的PageObjects处理更多功能,而不是使用PageObject IWebElements进行NUnit测试.

下面是我目前如何创建我的测试的示例.

public class LoginPage
{
    private IWebDriver webDriver;

    [FindsBy(How = How.Id, Using = "ctl00_ctl00_ctl00_insideForm_insideForm_content_txtPassword")]
    public IWebElement Password { get; set; }

    [FindsBy(How = How.Id, Using = "ctl00_ctl00_ctl00_insideForm_insideForm_content_cmdSubmit")]
    public IWebElement SubmitButton { get; set; }

    [FindsBy(How = How.Id, Using = "ctl00_ctl00_ctl00_insideForm_insideForm_content_txtUserName")]
    public IWebElement UserName { get; set; }

    public LoginPage() { }

    public LoginPage(IWebDriver webDriver)
    {
        this.webDriver = webDriver;


        if(!webDriver.Url.Contains("Login.aspx"))
        {
            throw new StaleElementReferenceException("This is not the login page");
        } …
Run Code Online (Sandbox Code Playgroud)

c# design-patterns webdriver pageobjects selenium-webdriver

29
推荐指数
1
解决办法
4万
查看次数

页面对象模型链接是否与Cucumber的Gherkin兼容?

使用Test Automation的页面对象模型,我们将页面链接在一起,如下所示:

WebDriver driver = new WebDriver()
HomePage homePage = new HomePage(driver);
LoginPage loginPage = homePage.GoToLoginPage();
WelcomePage welcomePage = loginPage.Login();
etc
etc
Run Code Online (Sandbox Code Playgroud)

这样做的最大好处是,如果开发人员更改主页,使其不再链接到登录页面,我可以更新我的主页类,并在运行测试之前查看我需要更新的所有测试(有错误).

然而,对于小黄瓜,上面的每一行将形成一个单独的"步骤",因此是一个单独的方法.因此,如何进行这种连接?

是将页面对象类的实例(例如homePage,loginPage等)放入交叉gherkin语句持久性存储(例如specflow POCO或'World')的唯一方法吗?

selenium cucumber specflow gherkin pageobjects

28
推荐指数
1
解决办法
2862
查看次数

Selenium中的页面对象模型最佳实践

在对页面对象进行建模时,如何处理具有表单和大约50个输入字段的页面?这里的最佳做法是什么?

您是否会为每个输入操作创建一个页面对象并编写一个单独的函数?或者你会写一个函数,哪些参数传递给它并输入文本?

例如

public void enterFirstName(String firstName) {
    driver.type("firstNameField", firstName);
}

public void enterSecondName(String secondName) {
    driver.type("secondNameField", secondName);
}
Run Code Online (Sandbox Code Playgroud)

要么

public void fillInForm(String inputFieldName, String text) {
    driver.type(inputFieldName, text);
}
Run Code Online (Sandbox Code Playgroud)

我可以在第一个模型中看到,在编写测试时,测试更具描述性,但如果页面包含太多输入字段,则创建页面对象会变得很麻烦.

使用Selenium WebDriver的页面对象功能自动化测试最佳实践中构建硒测试时,这篇文章也非常有趣

java selenium webdriver object pageobjects

23
推荐指数
2
解决办法
2万
查看次数

获取已找到的WebElement的By定位器

是否有一种优雅的方式来获取Selenium WebElement的By定位器,我已经找到/识别出来了?

要清楚这个问题:我想要用"定位器"来查找元素.在这种情况下,我对特定属性或特定定位器(如css-locator)感兴趣.

我知道我可以解析WebElement的toString()方法的结果:

WebElement element = driver.findElement(By.id("myPreciousElement"));
System.out.println(element.toString());
Run Code Online (Sandbox Code Playgroud)

输出将是例如:

[[FirefoxDriver:WINDOWS(....)上的firefox] - > id:myPreciousElement]

如果你通过xpath找到你的元素:

WebElement element = driver.findElement(By.xpath("//div[@someId = 'someValue']"));
System.out.println(element.toString());
Run Code Online (Sandbox Code Playgroud)

然后你的输出将是:

[[FirefoxDriver:WINDOWS(....)上的firefox] - > xpath:// div [@someId ='someValue']]

所以我目前编写了自己的方法来解析这个输出并给我"重新创建"By Locator.


但是有没有一种更优雅的方式已经在Selenium中实现,以获取用于查找元素的By定位器?

到目前为止我找不到一个.

如果您确定,没有开箱即用,您能想到API创建者可能无法提供此功能的任何原因吗?



*尽管这与这个问题无关,如果有人想知道为什么你需要这个功能,只需要两个例子:

  • 如果你使用PageFactory,你很可能不会将定位器作为Page类中的成员变量,但是在使用页面元素时可能需要它们.
  • 你正在使用那些只使用没有PageFactory的页面对象模式的人的API,因此希望你交出定位器而不是元素本身.*

java selenium pageobjects selenium-webdriver

22
推荐指数
2
解决办法
2万
查看次数

量角器中的嵌套页面对象

问题:

在Protractor中定义嵌套页面对象的规范方法是什么?

使用案例:

我们有一个复杂的页面,由多个部分组成:过滤器面板,网格,摘要部分,侧面的控制面板.将所有元素和方法定义放在单个文件和单个页面对象中不起作用和扩展 - 它变得一团糟,难以维护.

javascript selenium project-organization pageobjects protractor

17
推荐指数
2
解决办法
1477
查看次数

Ruby与严格的页面对象模式兼容吗?

我使用Page Object Pattern with Java(https://code.google.com/p/selenium/wiki/PageObjects)构建了各种Test Automation框架.

我发现的两大好处是:

1)当你有一个页面实例时,你可以看到可用的方法(例如,输入homepage.会显示你可以从主页调用的所有动作/方法)

2)因为导航方法(例如goToHomepage())返回后续页面的实例(例如主页),所以您只需编写代码并查看它所在的位置即可浏览您的测试.

例如

WelcomePage welcomePage = loginPage.loginWithValidUser(validUser);
PaymentsPage paymentsPage = welcomePage.goToPaymentsPage();
Run Code Online (Sandbox Code Playgroud)

这些好处与Java完美配合,因为IDE已知对象类型(或本例中的页面).

但是,使用Ruby,对象类型在任何时候都不固定,并且通常对IDE不明确.因此,我无法看到如何在使用Ruby构建的自动化套件中实现这些优势(例如,使用Cucumber).

谁能告诉我如何使用Ruby与页面对象模式来获得这些好处?

ruby java testing automation pageobjects

15
推荐指数
3
解决办法
367
查看次数