当前位置: 首页 > 面试题库 >

Selenium [Java] PageFactory设计:我应在何处根据页面对象模型编写断言

胡致远
2023-03-14
问题内容

我正在遵循页面对象模型来自动化一个应用程序中的流程。在模块之一中,我必须声明页面标题和更多消息。截至目前,我将我的断言代码放在PageFactory本身中,如下所示:

public class EditPost {

    WebDriver driver;

    public EditPost(WebDriver editPostDriver)
    {
        this.driver=editPostDriver;
    }

    @FindBy(how=How.XPATH,using="//*[@id='message']/p")
    WebElement post_published;

    public void assert_message()
    {
        String actual_message_title=post_published.getText();
        Assert.assertEquals(actual_message_title, "Post published. View post");
        System.out.println("Message: Post published, Successfully Verified");
    }
}

我从实现TestNG的主文件中调用assert方法,如下所示:

@Test (priority=5)
public void assert_message()
{
    //Created Page Object using Page Factory
    EditPost edit_post = PageFactory.initElements(driver, EditPost.class);
    edit_post.assert_message();

}

目前,我正在通过3个程序包运行执行程序。浏览器工厂的“ Helper”软件包,PageFactories的“ Pages”软件包和Testcase的“
Testcase”软件包。

我的目标是向前发展,我想重用为所有不同实用程序编写的代码。

我的问题是:

  1. 根据PageFactory&Page Object Model的概念,我的方法正确吗?还是我需要将断言移到“ Helper”包中?还是应该为断言创建一个单独的库/程序包?(在未来的日子里,我可能需要在一个页面上执行多个断言)

  2. 在下一个冲刺中,我可能需要执行其他一些活动,例如对所有/失败的测试用例进行屏幕截图。那么,如何保持设计的结构化和组织性,以便以最佳方式重用代码/库/利用它们?


问题答案:

根据我所见过的大多数网站,最佳实践是将断言保留在页面对象之外。以下是Selenium文档中的一个示例。

http://www.seleniumhq.org/docs/06_test_design_considerations.jsp#page-object-
design-
pattern

页面对象的设计方式具有很大的灵活性,但是有一些基本规则可以使测试代码具有理想的可维护性。

页面对象本身绝不应进行验证或断言。
这是测试的一部分,应始终在测试的代码内,而不是在页面对象中。页面对象将包含页面的表示形式,以及页面通过方法提供的服务,但是与对象测试无关的代码都不应包含在页面对象内。

可以并且应该在页面对象中进行一次单一验证,即验证页面以及页面上可能的关键元素是否已正确加载。实例化页面对象时应进行此验证。在上面的示例中,SignInPage和HomePage构造函数均检查预期的页面是否可用并准备接受测试请求。

页面对象应返回诸如产品名称,产品价格,当前选择的数量等信息。然后,测试代码将断言返回的字符串与期望的字符串匹配。

assert_message()将成为getMessage()并以形式返回该消息String。见下文。

public String getMessage()
{
    return driver.findElement(messageLocator).getText();
}

(注意:请继续阅读为什么我在PageFactory这里将元素更改为定位符。)

然后在测试代码中,

Assert.assertEquals(editPost.getMessage(), "Post published. View post");

现在,您将断言代码保留在测试脚本中,并保留在页面对象之外。

查看您的代码,我将提出一些进一步的建议。

  1. 我建议您阅读一些Java命名约定。有很多网站都提出了建议,我认为它们之间有很多相似之处,但这是从oracle开始的建议。您的方法名称应为

动词,首字母小写混合,每个内部单词的首字母大写。

所以assert_message()会变成assertMessage()等等。_s使它看起来更像python。

  1. 定位器的优先顺序:ID,CSS选择器,在极少数情况下为XPath。ID应该始终是您的首选,因为ID(根据W3C定义)在页面上应该是唯一的。接下来是CSS选择器,因为它是最快的(在我的测试中,它比ID更快),具有最佳的浏览器支持,并且在各个浏览器中实现的一致性最高。XPath仅应保留给CSS筛选器无法完成的事情,例如通过包含的文本查找元素。与CSS选择器相比,XPath定位器的性能较差,并且与CSS选择器的支持程度不同。例如,您的XPath定位器可以轻松转换为CSS选择器“ #message> p”。

以下是一些CSS选择器参考,可帮助您入门。

CSS选择器参考

CSS选择器提示

  1. 放下PageFactory。是的,这似乎使事情变得容易,但我认为在许多情况下,它会导致更多问题,例如陈旧的元素异常等。而是根据需要刮取页面。将所有定位符声明在类的顶部,并在需要时在方法中使用它们。
    public class EditPost {
    
    WebDriver driver;
    
    By messageLocator = By.cssSelector("#message > p")
    
    public EditPost(WebDriver editPostDriver)
    {
        this.driver = editPostDriver;
    }
    
    public String getMessage()
    {
        return driver.findElement(messageLocator).getText();
    }
    

    }

我知道这超出了您的要求,但希望对您有所帮助。



 类似资料:
  • 希望我不是第一个遇到这个问题的人。 问题是我还需要检查该元素在页面上是否可见,并且在执行checked之前它会出错(例如,使用WebDriverWait,将ExpectedConditions.ElementisVisible(by)传递给.Until方法)。 我如何将IWebElement和By locator清晰地分开,并允许在需要的地方进行这种明确的等待/检查? TLDR-如何维护页面对象模

  • 我下面的页面对象模型中,我已经放置了所有的WebElement地址和方法,即id,xpath等在页面中。示例:在登录页面上,我们有用户名字段、密码字段和登录按钮。因此,所有这些都将在LoginPage.java.本页还包括使用Webelements的方法。所以从实际的测试用例中,我只是调用页面上定义的方法。这就是我的困境。我有几个测试步骤需要我点击一个元素。所以说我需要点击链接1,链接2和链接3。

  • 可以在页面对象模型中处理动态元素吗? 例子: 我想从测试方法中传递输入的name属性值。

  • 我正在进行UI自动化测试,使用POM与Python和Selenium。我想知道如何处理重复的测试用例。 例如,您有两个网页:登录页和主页。我想测试三个测试用例。 未登录的主页功能:登录前测试主页。py (1和3有很多共同点。3有额外的功能。1是3的子集) 每个测试用例有三个文件,我已经实现了1和2。但是对于第三个模块,我只是从1和2模块中导入了相关函数。 问题是验证登录是否重复。在这种情况下,您是

  • 问题内容: 我知道您无法在中初始化对象。我一直在互联网上搜索,但只找到了一个可能的答案,可以使用但在实现方面没有太多细节。我要问他们是成功实施它还是有实现它的想法的人,可以通过以外的其他方式来确定。 目前,我仅使用以下内容: 我正在寻找实现的东西是这样的。 PS。我是selenium的新手,也是回来的Java开发人员,所以请好好对待我:) 问题答案: 由于没有人分享某些东西,因此我将分享我的做法。

  • 第一次海报。我已经在UI自动化领域工作了很多年,但直到最近才被介绍/指示使用页面对象模型。其中大部分是常识,包括我已经使用过的技术,但是有一个特别好的点我还没有能够在我自己的头脑中证明,尽管我广泛地寻找一个合理的解释。我希望这里有人能启发我,因为当我试图将POM与我自己的最佳实践相结合时,这个问题已经引起了一些恐慌。 从http://code.google.com/p/selenium/wiki/