WebDriver中的动态元素ID

时间:2012-01-22 11:51:16

标签: webdriver

最近我开始学习WebDriver作为我的客户,我正在计划使用WebDriver来自动化Web应用程序。

我怀疑WebDriver如何在id动态变化的网页上找到元素(比如更改每次登录到应用程序)。任何人都可以解释我们如何使用WebDriver完成这项任务?

5 个答案:

答案 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");