因此,我正在为我正在使用 Selenium 测试的网站编写面板对象 API,并且由于将来可能会被许多不受我控制的人使用,所以我认为我不妨让它具有防御性(如见有效 Java)。但是,在返回 By 的克隆时,我遇到了困难。
我期待像arrayList这样的方法有:
By newBy = new By(oldBy);
不存在,因为 By 是静态制作的。此外,除了toString(). 所以我可以为By.toString().
谁能建议一种在硒中克隆 By 定位器的不那么繁琐的方法?
因此,我正在为我正在使用 Selenium 测试的网站编写面板对象 API,并且由于将来可能会被许多不受我控制的人使用,所以我认为我不妨让它具有防御性(如见有效 Java)。但是,在返回 By 的克隆时,我遇到了困难。
我期待像arrayList这样的方法有:
By newBy = new By(oldBy);
不存在,因为 By 是静态制作的。此外,除了toString(). 所以我可以为By.toString().
谁能建议一种在硒中克隆 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")
;
}
}
(使用Selenium 框架入门的此类摘录)
在这里,click被重载以接受字符串(CSS 选择器)但也可以接受By类。
如果您希望您的所有开发人员特别使用一件事,而不是接受 a By,只需让它接受一个字符串,并且字符串必须是 CSS、ID 或 Xpath(无论您喜欢什么)。这会让它更干净一些,而且肯定更巩固。(您的测试人员将被迫使用 CSS 或您选择的任何内容)
By是一个抽象类。如此处所述,您无法创建抽象类的深层克隆,因为它们无法被实例化。你可以看看建议的黑客,但我认为你不需要这么防御