最近我开始学习WebDriver作为我的客户,我正在计划使用WebDriver来自动化Web应用程序。
我怀疑WebDriver如何在id动态变化的网页上找到元素(比如更改每次登录到应用程序)。任何人都可以解释我们如何使用WebDriver完成这项任务?
答案 0 :(得分:5)
使用动态ID定位元素可能很脆弱。我宁愿使用一些可见的文本,例如xpath表达式。我的观点是,在大多数情况下,可见文本通常是要求的一部分或应用程序的规范, id不是。因此,id更可能发生变化,而可见文本则不然。
例如,要在登录表单中找到用户名字段,我可以使用xpath:
//标签[。= '用户名'] //以下::输入[1]
这假设在输入字段之前有一个标签“Username”。
我发现Firebug控制台函数$ x(“xpath string”)在调试这些xpath时非常有用。
答案 1 :(得分:3)
对于ids动态变化的网页上的那些元素:
您可以尝试通过Xpath定位器或CSS定位器
定位元素
您可以在使用WebDriver here时找到有关定位器策略的更多信息。看看这些,你会想出各种定位策略。
为了理解用于定位动态元素的概念,您可以查看Selenium1文档here。 但请注意,此链接中的api适用于Selenium 1. 但您可以使用概念和之前为WebDriver提供的定位器策略/ api来完成您的任务
答案 2 :(得分:2)
我们遇到了同样的问题,我们最终使用了jquery选择器,特别是如果你的客户端已经有了jquery。在我们使用的ZK框架中,我们已经有一些jquery扩展,所以我们可以简单地写:
assertEquals(driver.findElement(By.jq("@label:eq(0)")).getText(),"ROOT_MESSAGE");
当By.jq()有效归结为:
return (WebElement)((JavascriptExecutor)context).executeScript("return jq('" + selector + "').get(0);");
答案 3 :(得分:0)
您可以使用匹配元素名称的contains()
方法来实现它。
WebElement cls = (new WebDriverWait(ff, 10))
.until(ExpectedConditions.elementToBeClickable(By.xpath("//a[@class='_54nc']/span/
span[contains(text(), 'Log Out')]")));
答案 4 :(得分:0)
您可以尝试: https://github.com/sdl/Testy/ 语法很简单:
// 1. import maven dependency
// 2. init Framework in your TestBase after initializing your driver
WebDriverConfig.init(driver);
// 3. any actions based on many many attributes
WebLocator logoutBtn = new WebLocator().setText("Log Out");
// make sure the element is rendered even after fiew seconds (5 by default)
logoutBtn.assertReady();
// or do any actions with elements
logoutBtn.click();
// more properties for selecting/testing specific element with wanted attributes
WebLocator closeIcon = new WebLocator().setClasses("close").setTitle("Close");
WebLocator minimIcon = new WebLocator().setClasses("minimize").setTitle("Minimize");