我一直在一个webdriver项目中自动化我的测试,我尝试开发类似帮助器的东西 . 默认情况下,By类方法有CssSelector(),XPath(),ClassName()等 .
我的问题是:可能(以及如何?!)我可以扩展这个类来创建另一种方法来简化我的代码?我希望By调用我自己的方法 . 我搜索并获得了一些结果如何创建NewBy,但我认为它可以使我的代码在未来变得杂乱无章 .
Selenium中默认存在的内容:
FindElement(By.CssSelector("#example"));
我正在努力发展:
FindElement(By.MyOwnMethod("example"));
谢谢!
3 回答
简而言之,你不应该让你的代码变得更干净,这使得它更难以阅读,因为其他任何有Selenium经验的人都没有添加另一层抽象,只需使用Selenium编写 . 如果您有HTML,其中有多个管理菜单只有索引不同,例如
By.CssSelector("[selenium-admin-menu='3']")
然后编写一个接受索引并返回正确元素的函数 .或者更好的是,根据每个管理菜单的实际名称为每个管理菜单创建一个函数,以便该函数的使用者将确切知道该函数的功能,并且不必查看页面的HTML并计算管理菜单以返回正确的一 .
很明显,这些都是例子,因为我不知道你的网站 .
在css中,
#
符号是ID选择器 . 您可以使用By.Id(string)
方法 .编辑:
如果您真的想要自定义它,可以定义自己的
By
实现 . 但是你可以't extend static method, therefore you will need create a new class to host them. I' ll在这里使用Via
,你可以随时使用更有意义的名字,比如网站名称:如果您希望驱动程序具有使用特定于用例的DOM的快捷方式,则可以始终扩展
IWebDriver
而不是By
.那么这一行from Xiaoy312 ......
减少到
JeffC's critique是一个有趣的 .
FindAdminMenu
可能是不透明的,特别是如果你可以更好地使用人类可读的类名,如果你可以改变编写DOM的方式 .对于人类可读的类,我不会那么做Page Object Modeling与Page Object Modeling没那么太不同,对于Selenium来说,我认为通常是一件好事 . POM将保持测试的动作/业务逻辑层从DOM更改中抽象出来 . 并且会有DOM更改[比业务逻辑更改更常见] . ; ^)