存储定位器的最佳方式

时间:2015-01-22 14:41:41

标签: java selenium selenium-webdriver pageobjects

我正在关注Selenium自动化的页面对象设计模式,我可以猜测很多人在.properties文件中存储定位器并在代码中访问它们。将定位器放在不同的位置似乎很棒。

既然,我还没有参与任何关于Selenium自动化的大项目,我想知道关于跟踪的想法,以便我可以避免将来可能出现的问题:

  1. 在大型项目中存储属性文件中的定位器是否有用(测试用​​例超过1000个左右)?

    a)如果对大项目没有帮助,那么我们不会将定位器存储在属性文件中会有什么困难?

    b)如果它有用,如果采取了哪些预防措施可以使工作更轻松?

  2. 与属性文件相比,在页面类中存储定位器本身是最好的方法吗?

5 个答案:

答案 0 :(得分:7)

我认为将文件存储在页面类本身中。从属性文件加载会产生额外的开销或解析大文件。保持这样的文件也会更难,即使有良好的工具支持,你也不得不使用CTRL + F。

即使在更概念的层面上,也感觉不对。适合存储在属性文件中的是可配置参数,尤其是那些适合在运行时调整的参数。

定位器没有这种性质。如果您正在寻求的好处是在一个中心位置声明,您应该使用专用的常量类,这将为您提供更好的重构选项。

答案 1 :(得分:3)

我绝对同意@Master Slave。 selenium的主要目的是使UI测试更容易。将locators存储在property文件中是一项繁琐且额外的开销以及重构的噩梦。 PageObject是杨树的主要原因是因为它能够以非常直观的方式映射元素

@FindBy(name="q")
private WebElement searchField;

@FindBy(name="btnG")
private WebElement searchButton;

在重构和调试的情况下,它更容易阅读。并且,当页面出现问题或更改时,您会发现 KNOWN 位置,并且您知道它在哪里!

答案 2 :(得分:1)

有两种基本方法:

1)使用FindBy注释

@FindBy(xpath = "//*[@class = 'stackoverflow']")
private WebElement question;

2)在方法结构中使用By / WebElement类

By stackoverflow = By.xpath("//*[@class = 'stackoverflow']");
WebElement stackoverflowElement = getDriver().findElement(stackoverflow);

我完全同意@Saifur和@MasterSlave。

答案 3 :(得分:1)

我不反对以任何格式存储定位符-属性,INI,XML或xls,只要每个文件很小且易于管理。 我认为,当我们谈论1000个或更多测试用例时,对于仅使用一次的全局变量(例如URL,端口号,用户名,密码,电子邮件),应存储在单独的global_variables文件中。每个页面的定位符可以存储在SEPARATE文件中。如果为每个页面维护一个文件,则定位器是可管理的。页面将仅导入所需的文件。 显然,此方法创建的属性文件数量与页面数相同。通过为相关模块或功能页面创建单个文件可以更好地解决此问题。无论如何,作为用户,我们需要在数量较少但数量庞大的定位器文件之间或在数量较多但较小的可管理定位文件之间进行平衡。

答案 4 :(得分:0)

我同意有一个运行环境的小项目。让我们假设我们让项目在两个环境中运行,如测试和生产。假设在测试中定位器已更改,那么如果要更改在两种情况下都能正常工作的代码,则应转到分支。如果定位器放在属性文件中,您只需将文件更改为属于环境。