考虑以下源代码,
<div id="groupContainer" class="XXXXXX">
<ul id="GroupContactListWrapper" class="list-wrapper">
<li class="contactNameItemContainer">
<div class="contactNameItem">
<span class="name">Name1</span>
</div>
</li>
<li class="contactNameItemContainer">
<div class="contactNameItem">
<span class="name">Name2</span>
</div>
</li>
</ul>
</div>
如何在列表变量中检索两个名称(Name1,Name2)? 我尝试了以下xpath来获取&#34;获取文本&#34;关键字,但只返回第一个。
//div[@id='groupContainer']//li[@class='contactNameItemContainer']//span
请建议
答案 0 :(得分:8)
您可以按如下方式迭代元素:
${xpath}= Set Variable //div[@id='groupContainer']//li[@class='contactNameItemContainer']//span
${count}= Get Matching Xpath Count ${xpath}
${names}= Create List
:FOR ${i} IN RANGE 1 ${count} + 1
\ ${name}= Get Text xpath=(${xpath})[${i}]
\ Append To List ${names} ${name}
这有效,但是当有很多比赛时相当慢。
答案 1 :(得分:2)
Get Text将返回与定位器匹配的第一个元素的内容。使用XPATH时,您可以指定要获取的元素的索引,如下所示:
${name1} Get Text xpath=//div[@id='groupContainer']//li[@class='contactNameItemContainer'][0]//span
${name2} Get Text xpath=//div[@id='groupContainer']//li[@class='contactNameItemContainer'][1]//span
@{names} Create List ${name1} ${name2}
答案 2 :(得分:2)
@Velapanur
我有另一个类似的要求,我必须在页面中将文本输入textareas。 下面我写了关于Todor建议的想法,并且它有效。非常感谢Todor,Velapanur
@{Texts}= Get WebElements ${AllTextboxes}
:FOR ${EachTextarea} in @{Texts}
\ Input Text ${EachTextarea} ${RandomTextdata}
答案 3 :(得分:1)
您可以扩展Selenium2Library
并为此目的编写自己的关键字。将以下内容另存为Selenium2LibraryExt.py
from Selenium2Library import Selenium2Library
class Selenium2LibraryExt(Selenium2Library):
def get_all_texts(self, locator):
"""Returns the text value of elements identified by `locator`.
See `introduction` for details about locating elements.
"""
return self._get_all_texts(locator)
def _get_all_texts(self, locator):
elements = self._element_find(locator, False, True)
texts = []
for element in elements:
if element is not None:
texts.append(element.text)
return texts if texts else None
然后,您可以在测试中使用新的Get All Texts
关键字:
*** Settings ***
library Selenium2LibraryExt
*** Test Cases ***
Get All Texts Test
Open Browser http://www.example.com chrome
@{texts} Get All Texts css=.name
Log Many ${texts}
答案 4 :(得分:1)
虽然评价最高的答案是完全正常的 - 并且xpath-ish :)最多,但是让我添加一个我还没看到的选项 - 使用Get Webelements
关键字。 E.g:
@{locators}= Get Webelements xpath=//div[@id='groupContainer']//li[@class='contactNameItemContainer']//span
${result}= Create List
:FOR ${locator} in @{locators}
\ ${name}= Get Text ${locator}
\ Append To List ${result} ${name}
它将生成并返回所有匹配元素的列表,您只需迭代它们。它可能比xpath的[index]
引用快一点,因为dom被评估一次 - 但如果不完全正确则不要让我负责:)
答案 5 :(得分:-1)
这是获取Java中所有元素的逻辑。你可以根据自己的需要采用它。
你必须使用findElements()而不是findElement()来获取所有元素。
List<WebElement> items = driver.findElements(By.cssSelector("ul#GroupContactListWrapper div.contactNameItem"));
foreach(item in items){
System.out.println(item.getText();
}
如果您想要列表中的特定元素,可以使用items.get(1)