在selenium webdriver中处理动态生成的id

时间:2013-02-02 08:40:58

标签: selenium-webdriver

我正在尝试自动测试包含项目列表的网页。用户输入项目被选中并被删除。在这里,我需要选择VD2并删除该项目。

<div id="virtual_domains-content">
    <div class="columns">
        <div class="left-column">
            <h2>Virtual Domains</h2>
                <div class="search-row">
                    <div class="box scrolling list-editable">
                        <div id="virtual_domains-list" class="list-view">
                            <div id="virtual_domains-list-11" class="list-item-view">
                                <div class="content"> VD1 </div>
                            </div>
                            <div id="virtual_domains-list-35" class="list-item-view">
                                <div class="content"> VD2 </div>
                            </div>
                        </div>
                    </div>

我从下面的代码中获得的列表只有第一个元素 - VD1。没有捕获第二个元素。有人可以帮我解决问题吗

List<WebElement> list = webdriver1.findElements(By.xpath("//*[starts-with(@id,'virtual_domains-list-')]"));
for(WebElement option : list){
    System.out.println(option.getText());
    if(option.getText().equals("VD1")) {
        option.click();
        break;
    }

4 个答案:

答案 0 :(得分:0)

在处理随机生成的ID时,我不建议在xpath定义中使用它们。尝试使用类似下面的内容,而不是使用类,并从树的顶部开始,以获得更可靠的xpath。

String items = "//div[@id="virtual_domains-content"]/div[@class="columns"]/div[@class="search-row"]/div[@class="box scrolling list-editable"]/div[@class="list-view"]//div[@class="list-item-view"]"

List<WebElement> e = driver.findElements(By.xpath(items));

这将为您提供所有VD的列表,然后您可以执行类似

的操作
String item;
Int listItem = 0;
for(WebElement i : e){
    item = "(//div[@id="virtual_domains-content"]/div[@class="columns"]/div[@class="search-row"]/div[@class="box scrolling list-editable"]/div[@class="list-view"]/div[@class="list-item-view"])[i]" 
    e.get(listItem).findElement(By.xpath(i));
    ...
    ...
}

您可能希望定义i = 1以开始循环,因为列表中的元素将从1开始,而不是从0开始的列表元素

答案 1 :(得分:0)

对于带有动态ID的webelements,而不是使用Ids的Xpath,我们可以寻找其他方式来查找'by tagname',CSSlocator等元素。它对我有效。

如果您仍想使用Xpath,您可以从

获取webelement的动态名称或ID
driver.findelementsbytagname().

并在构建Xpath时使用它。

示例:

List casereq_table = E.findElementByTagName("table");
tableid1 = tableid.getAttribute("id");
WebElement Certain = E.findElementByXPath("//*[@id='"+tableid1+"']/tbody/tr/td[10]");
certainity = Certain.getText();

这里,动态表id存储在字符串变量中,并在Xpath中使用。

答案 2 :(得分:0)

在上面的代码中,您发布了包含类名的代码。所以,为什么不使用类名。

这里,我的示例python代码可以解决这个问题

options=driver.find_element_by_class_name("list-item-view")
     for option in options:
         if(option.text=="VD2")
             option.click()

答案 3 :(得分:0)

您应该可以使用相当简单的Xpath By定位器来找到它。

By.xpath("//div[@id='virtual_domains-list']//div[text()=' VD2 ']");

然后像任何其他元素一样点击它。

如果您不担心它位于&#39; virtual_domains-list&#39;中,您甚至可以找到带有文本VD2的div。格。

如果您对点击包含div特别感兴趣,可以使用

By.xpath("//div[@id='virtual_domains-list']//div[text()=' VD2 ']/..");

使用尾随/ ..表示获取该元素的父级。