【问题标题】:Using Page Objects vs Config Files in Selenium在 Selenium 中使用页面对象与配置文件
【发布时间】:2017-02-12 19:11:48
【问题描述】:

我一直在将 Ruby Selenium-Webdriver 用于我正在开发的自动化脚本之一,我被要求使用页面对象,我们经常使用页面对象,但是对于这个应用程序,我使用的是 CSV 文件,我已经在 CSV 文件中定义了我在我的应用程序中使用的所有 xpath,并且我正在我的脚本中解析该 CSV 文件以引用这些对象,我想知道使用类有很大的不同用于定义页面对象或使用 CSV 文件而不是性能问题?我相信从配置的角度来看,使用 CSV 文件对我们来说是一个插件,并且会更容易维护,对此有什么建议吗?

编辑 - 在我们的用例中,我们实际上是自动化构建在基于云的工具上的应用程序,所以从 HTML 的角度来看,基本上所有应用程序都共享相同的设计结构,因此我们在 CSV 中定义 xpath 模式,然后我们将某些参数传递给一些我们开发的自定义方法使用 CSV 自动生成 xpath,而不是手动查找这些作为我们的开销,因为我们已经知道所有应用程序将为所有元素共享相似的 xpath 模式。

谢谢

【问题讨论】:

    标签: ruby selenium selenium-webdriver automated-tests pageobjects


    【解决方案1】:

    我认为,POM 比 CSV 方法更好。在 POM 中,您将页面的元素放在单独的类文件中。因此,如果要进行任何更改,则更容易找到更改/维护的位置。此外,它不会像 CSV 文件那样变得太乱,您不需要使用额外的实用程序函数来解析它们。

    【讨论】:

    • 实际上,我们的用例与一般的 Web 应用程序自动化有点不同,我们永远不能依赖 Id 和元素类,因为它们在每次刷新时都会发生变化,所以我们唯一的选择是使用 xpath 现在这里的另一个问题如果我们使用分区导航到元素,这对我们来说又是一个松散的情况,因为一旦我们将应用程序移动到不同的环境,该元素的类也会发生变化,所以我们使用标签来导航到元素
    【解决方案2】:

    还有一个 pageobjects gem,它提供了一组超越 webdriver/watir 的库,简化了代码。

    另外,为什么要使用 xpaths?它是最后推荐的识别元素的方法之一。

    至于框架方面,csv 应该比 PageObjects 更多的是维护问题。它是文本和代码之间的基本区别。您对 PageObjects 中的元素强制执行面向对象的方法,但使用 csv 是不可能的。

    在最好的情况下,您已经创建了一个列/单独的工作表来定义元素 xpath 属于哪个页面。这听起来像是开销。随着您的应用程序/套件的增长,可能会有数千个元素。想象一下使用这种数据解析/手动更新 csv。

    在 PageObjects 中,您的元素将被限制在页面中。对应用程序的任何更改还将指定哪些元素可能会受到影响。现在,当您将元素定义为 PageObject 中的对象而不是 css 时,您也不需要通过读取 csv 来显式创建元素。

    【讨论】:

    • 我们使用 xpath 的原因是我们的应用程序是动态的,这意味着每次刷新页面时它都会更改每个元素的 id,而且我们现在是在基于云的技术上进行的如果将我们的应用程序从 DEV 迁移到 UAT 再到 PROD,那么即使是部门的类别也会发生变化
    • 我们实际上是在自动化基于云工具构建的应用程序,因此所有应用程序在 HTML 方面共享相同的基本结构,因此我们不需要基于页面查找元素,因为结构总是相同的无论是环境中的任何应用程序,这都是加速我们的脚本开发的原因,我们在 csv 中定义了 xpath 模式,然后通过使用这些 CSV 文件将一些参数传递给自定义方法来动态生成元素的实际 xpath
    【解决方案3】:

    这完全取决于您可能执行的应用程序和测试类型。

    由于它是一个自动化测试脚本,您不必真正担心脚本的性能(解析可能需要多几毫秒,这应该没问题)。

    在 CSV 文件中维护所有元素标识属性和相应的操作将使维护更容易,并使框架应用程序独立,这很好。但是维护你的框架有点困难,使它更健壮。这两种方法各有利弊。

    请参阅下面的帖子[示例在 java 中 - 但你会明白的]:

    1. Keyword driven framework
    2. Advanced Page Objects

    更新:

    如果你喜欢这两者,你可以想出你的实现来轻松地集成它们。

    @ObjectRepository(src="/login.csv")
    public class LoginPage{
    
        private Map<String, WebElement> elements; 
    
        public void login(){
            elements.get("username").sendKeys('');
            elements.get("password").sendKeys('');
            elements.get("signin").click();
        }
    }
    

    即,在 csv/json 等配置文件中定义所有元素。让页面对象引用页面元素的类。所有方法都将成为页面类的一部分。

    【讨论】:

    • 我同意你的观点,如果你看看我在这个线程上所做的编辑,你会有什么建议?只是为了给您一个概述,我们正在自动化基于云基础工具构建的应用程序,因此所有应用程序从 HTML 角度共享相同的基础结构,因此我们决定在 CSV 中定义通用 xpath 模式,然后使用自定义方法将标签传递给该 csv 到如果我们为每个应用程序定义页面对象,则动态生成元素的实际 xpath,这对我们来说是一种开销,因为我们将不得不手动查找这些对象
    • @utkarshs,看,如果您打算主要使用它并在将来维护它,请让它处于您的舒适水平。请参阅我的更新答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多