0

我正在尝试自动测试包含项目列表的网页。用户输入项目被选中并被删除。在这里,我需要选择 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

4 回答 4

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 开始的列表元素

于 2013-02-02T20:07:01.563 回答
0

In case of webelements with dynamic Ids, instead of going for Xpath with Ids we can go for other way of finding elements like 'by tagname', CSSlocator,.. it worked for me.

If You still want to use Xpath, You can get the dynamic name or id of the webelement from

driver.findelementsbytagname().

And use that in building Xpath.

Example:

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

Here, the dynamic table id is stored in a string variable, and it is used in the Xpath.

于 2013-02-04T06:55:34.053 回答
0

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

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

options=driver.find_element_by_class_name("list-item-view")
     for option in options:
         if(option.text=="VD2")
             option.click()
于 2013-12-27T05:42:22.977 回答
0

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

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

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

如果您不担心它位于“virtual_domains-list”div 中,您甚至可以只找到带有文本 VD2 的 div。

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

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

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

于 2017-08-16T17:55:00.297 回答