【问题标题】:Best Design Pattern for Selenium Automation for Large Scale Application用于大规模应用的 Selenium 自动化的最佳设计模式
【发布时间】:2017-10-28 08:28:44
【问题描述】:

我想知道用于自动化大规模 SaaS 产品的 Selenium 的最佳设计模式。

在此寻找您所有的 cmets。

对于大型应用程序,我更喜欢将我的 xpath 用于页面对象文件中的 web 元素。但我的领导希望我将 xpath 保留在属性文件中,我们应该访问每个 xpath 的属性文件。这是将 xpath 保存在大型 SaaS 应用程序属性文件中的好方法吗?

【问题讨论】:

  • 首先,你知道怎么写代码吗?
  • 是的。我目前正在使用页面对象模型。你想要我可以给你看我的代码!
  • 准确描述你的需求..你的问题太模糊了..
  • 我要说的第一件事是删除所有可以使用至少 cssSelectors 的 XPath。然后,我必须请您阅读How to ask,一旦您的问题可以考虑基于主要意见。

标签: selenium selenium-webdriver pageobjects page-factory


【解决方案1】:

您的 LEED 希望您实施 Object Repository Pattern

我认为这个想法与广泛使用的 HP QTP(QuickTest Professional)一样古老 - 但我可能错了,这只是我的意见。

简而言之(来自上述链接的引用):

对象存储库是我们可以存储对象的集中位置 信息,它充当测试脚本和应用程序之间的接口 以便在执行期间识别对象。


我们始终建议对对象存储库使用外部文件,而不是对对象及其属性进行硬编码 直接进入我们的代码。如果你问我这是为什么?原因如下 它减少了维护工作并提供了积极的投资回报率,对于 例如说我们的应用程序中的任何对象属性都发生了变化 在测试中,我们可以在外部对象存储库中轻松更改它 文件,而不是搜索和更新该对象 分别在代码中


想象一个场景,你有一个网页,它有多个 部分、多个框架和数百个 WebElement。显然你 不希望这样,一旦您键入页面名称,它将为您提供所有信息 网页上可用的元素。如果元素很少, 有相同的结构很好,但如果有很多,那就是 建议将您的页面分成不同的部分,例如 页眉、页脚、左侧导航、中心内容和右侧导航。 然后将每个 WebElement 归类到其父元素下。


我认为这种模式与页面对象模式并不矛盾,它们可以很好地协同工作。它为项目带来了更高的透明度,并迫使开发人员/测试人员保持更好的项目可读性,这有助于在未来维护它。


但以上只是一点理论,有人可能会问这种模式在现实生活中有何帮助?

考虑一个简单的例子。假设有一段代码:

public class SomePageObject{
   .....
   .....
   public void doSomething(String value){
      findElement( By.xpath("//*[ @class='left-content']//button[ contains( ., 'list-selector' )]") ).click();
      wait.until( ExpectedConditions.visibilityOfElementLocated( By.xpath( String.format( "//li[ *[ text() = '%s' ]]", value ))).click();
}

我已经看过这样的代码数百次了。你觉得这段代码怎么样?
是的,它遵循众所周知的页面对象模式。但这太可怕了。
看看这段代码,你能猜出它在做什么吗? 绝对没有。

当此代码由于第二个元素的 UI 更改而中断时,您将在日志中收到什么错误消息?很可能是这样的:

org.openqa.selenium.TimeoutException: Timed out after 30 seconds 
waiting for visibility of element located by By.selector: //li[ *[ text() = 'New York' ]]

您能猜出,仅查看此错误消息,它涉及应用程序的哪个部分以及在代码中的哪个位置可以找到它? 没有。
自动化工程师可以在查看堆栈跟踪的代码中找到它,但不了解 java、selenium 等的初级测试人员无法仅查看错误和打印屏幕(如果可用)来修复它。
在许多情况下,为了修复错误,自动化工程师需要在本地机器上运行此测试用例来复制问题。


如何使用对象存储库模式?
可能会有一个如下所示的属性文件:

....
orderPage.citySelectButton=//*[ @class='left-content']//button[ contains( ., 'list-selector' )]
orderPage.citySelectListElement=//li[ *[ text() = '%s' ]]
...
...

以及可能如下所示的代码:

public class SomePageObject{
   .....
   .....
   public void doSomething(String value){

      objRepoFacade( "orderPage.citySelectButton" ).click();
      objRepoFacade( "orderPage.citySelectListElement", value ).wait().click();
      ...
    )
}

日志中的错误信息可能如下所示:

RuntimeException: time out waiting for element: orderPage.citySelectListElement
located by By.selector: //li[ *[ text() = 'New York' ]]

现在,即使是初级测试人员,仅查看此错误消息,也能够轻松猜测错误发生在应用程序的哪个部分,以及哪个元素被破坏了。测试人员可能会接受培训,如何使用开发人员控制台 (F12) 检查页面上的元素,更正 procerties 文件中的选择器,并在无需自动化工程师帮助且完全不接触代码的情况下自行解决问题。


大概从您的 leed 的角度来看,后者(对象存储库)是一个更好的解决方案,因为它可以雇用更多初级测试人员和更少的自动化工程师并降低成本。

【讨论】:

    猜你喜欢
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2013-10-19
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    相关资源
    最近更新 更多