1

因此,我正在为我正在使用 Selenium 测试的网站编写面板对象 API,并且由于将来可能会被许多不受我控制的人使用,所以我认为我不妨让它具有防御性(如见有效 Java)。但是,在返回 By 的克隆时,我遇到了困难。

我期待像arrayList这样的方法有:

By newBy = new By(oldBy);

不存在,因为 By 是静态制作的。此外,除了toString(). 所以我可以为By.toString().

谁能建议一种在硒中克隆 By 定位器的不那么繁琐的方法?

4

2 回答 2

1

请注意,这只是一种选择。

在防御性编程方面,我可以向您推荐一件事,我已经在其他几个使用 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 或您选择的任何内容)

于 2014-11-11T20:55:56.143 回答
0

By是一个抽象类。如此处所述您无法创建抽象类的深层克隆,因为它们无法被实例化。你可以看看建议的黑客,但我认为你不需要这么防御

于 2014-11-11T17:45:52.347 回答