我正在尝试自动测试包含项目列表的网页。用户输入项目被选中并被删除。在这里,我需要选择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;
}
答案 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的动态名称或IDdriver.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 ']/..");
使用尾随/ ..表示获取该元素的父级。