因此,我正在为一个正在使用 Selenium 进行测试的网站编写一个面板对象 API,并且由于这个 API 将来可能会被我无法控制的许多人使用,所以我想我也可以将其设置为防御性的(如《Effective Java》中所示)。然而,在返回 By 的克隆时,我遇到了困难。
我期待像 arrayList 这样的方法:
By newBy = new By(oldBy);
不存在,因为 By 是静态生成的。此外,除了 toString()
之外,一旦信息存在,我不知道有什么方法可以从 By 中获取信息。因此,我可以为 By.toString()
编写一个解析器,但这对于这项工作来说似乎需要付出很大的努力,而且启动起来不太优雅。
任何人都可以建议一种在 Selenium 中克隆 By 定位器的不太麻烦的方法吗?
最佳答案
请注意,这只是一种替代方案。
就防御性编程而言,我可以向您推荐一件事,我已经在使用 Selenium 的其他几个自动化框架中完成了...
是包装driver.findElement
,然后只接受CSS选择器、ID、Xpath,无论你想要什么。一个例子是这样的:
@Config(
url="http://wordpress.org",
browser = Browser.CHROME
)
public class GettingStarted extends AutomationTest {
@Test
public void testSeleniumHQ() {
navigateTo("http://docs.seleniumhq.org")
.click("a[title='Selenium Projects']")
.click(By.xpath("//div[contains(@class, 'bigMenu')]//p/a[@href='webdriver/']"))
.validateTextPresent("Selenium 1.0 + WebDriver = Selenium 2.0")
;
}
}
(使用 this class 摘自 Getting Started with Selenium framework )
在这里,click
被重载以接受字符串(CSS 选择器),但也可以接受 By
类。
如果您希望所有开发人员都使用特定的东西,则不要接受 By
,只需让它接受一个字符串,并且该字符串必须是 CSS、ID 或 Xpath(无论您喜欢什么)。这会让它变得更干净一些,而且肯定更巩固。 (您的测试人员将被迫使用 CSS 或您选择的任何内容)
关于java - 克隆 "By": Defensive Programming with Selenium,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26870890/