我一直在使用带有java+TestNG框架的Selenium web驱动程序,然而,我已经找到了一份工作,但他们使用了ruby+Selenium web驱动程序和页面对象模型。我搜索了谷歌,收集了一些资源,在开始之前通读一遍,但我想练习一下。根据我的理解,我可能完全错了,但对于页面对象模型,您在一个单独的类中创建对象,该类与实际对象具有相同的属性,然后使用带有测试代码的不同类来测试这些对象?
我想从头开始练习和学习有人知道硒红宝石的一些具体教程吗?我曾经http://toolsqa.com/对于用java学习来说,这很好,但用ruby学习会很棒吗?
还有最后一个问题!我在一个有本地环境的工作环境中进行测试,什么是一个好的公共网站,它有注册、登录等功能,我可以练习写测试?
感谢
与其关注特定的框架,不如在测试中需要更多关于页面对象模型模式背后的理论的信息。
高级概述
为网站编写自动化UI测试的问题之一是,UI逻辑和测试逻辑之间没有明确的问题分离。页面对象模型模式旨在通过将测试分离为自己的测试类来解决这个问题,这些测试类只包含测试逻辑(例如断言、应用程序流)。页面对象类包含与页面的交互(例如,单击按钮和在页面上填写表单)。
页面对象-详细信息
这些类是一个"页面"的表示,它不仅是一个标准网页,还可能意味着页面的一部分或模式对话框。
它们只包含如何在页面上做事情,例如:
- 单击按钮
- 填写表格
- 从页面中获取元素
通常,它们被写成Fluent Interface
想象一下,一个应用程序有一个主页和一个联系人目录来搜索联系人。这将是两个页面对象。主页页面对象和ContactsDirectoryPageObject。每个对象处理如何与页面交互以执行操作和获取数据。所以一些puesdocode可能看起来像:
# The Homepage Page Object
class HomepageObject {
ClickContactsDirectoryPageButton()
{
webdriver.click(By.Id("contactsDirectoryButton"));
}
GetContactsDirectoryPageObject()
{
return new ContactsDirectoryPageObject()
}
}
# The Contacts Directory Page Object
class ContactsDirectoryPageObject {
SearchForContact(contactName)
{
webdriver.findElementById("searchBox").Click().SendKeys(contactName)
webdriver.findElementById("search").Click()
}
GetFoundContactInformation()
{
resultElement = webdriver.findElementById("result")
# Some logic to convert element into a model to pass back
result = new ContactResultModel(resultElement);
return result;
}
}
在测试中使用页面对象
因此,当在测试类中使用时,它们可能看起来像(puesdocode):
class MyTest {
daveContact = homepage.ClickContactsDirectoryPageButton()
.GetContactsDirectoryPage()
.SearchForContact("Dave")
.GetFoundContactInformation()
Assert.That(daveContact.Name).Equals("Dave")
}
现在测试只做一项工作——断言被测试的特性有效。通过处理应用程序并断言其中的数据。测试对页面是如何构建的一无所知。
为什么Bother(优点)
- 如果测试同时包含测试逻辑和页面对象模型逻辑,那么每次按钮或文本框的ID更改时,都必须更新所有测试
- 测试变得更容易阅读,因为它们只专注于绘制应用程序的流程并断言它是正确的
- 当应用程序更改时更新测试更容易,因为只有一个地方可以更新它——页面对象