如何解决方法不可用,需要“不必要的”重写吗?
List<WebElement> aList = driver.findElements(By.xpath("//something"));
List<WebElement> bList = driver.findElements(By.xpath("//something"));
在第一个示例中,XPath指向元素内容(例如<b>element content</b>
),并用一堆字符串填充aList。
对于bList
,我想在找到的节点上使用getAttribute("alt")
(在HTML标记中返回alt属性的字符串值)并将其保存在bList中,但是如果我执行以下操作,则该方法不可用/不适用:
List<WebElement> bList = driver.findElements(By.xpath("//somethingElse")).getAttribute("alt"); //doesn't work
那是为什么?我真的需要
bList.get(1).getAttribute("alt");
?也就是说,一个接一个地访问每个返回的元素,然后对它们调用getAttribute
。如果我能像在aList上一样在一行中完成所有这些操作,那就更好了。
要澄清:
- 这主要是Java语法问题。
- 有关其外观的示例。我有几个与
something
-XPath相匹配的html元素,看起来像这样的<b alt="EN">some text</b>.
我希望some text
进入aList
(这可行),而EN
应该进入bList
。我该如何将bList
情况写成一个单行代码?
解决方法
是的硒方法:.getAttribute()
仅适用于一个WebElement而不适用于整个列表,因此您应该按照您所说的那样应用for循环...
那样:
List<String> blist = new ArrayList<>();
for (WebElement el:alist) {
blist.add(el.getAttribute("alt"));
}
,
您的(async () => {
const rawResponse = await fetch('http://localhost:3000/api/cameras/order',{
method: 'POST',headers: {
'Accept': 'application/json','Content-Type': 'application/json'
},body: JSON.stringify({a: contactObject,b: idStrings})
});
const content = await rawResponse.json();
console.log(content);
})();
和aList
变量都是bList
,它们包含项目的集合,而不仅仅是一个项目。为了在其上使用List
,可以使用循环并分别处理每个循环,或者由于需要单线,可以使用.getAttribute()
。
一个简单的例子是
stream()
此代码获取List<String> aListStrings = aList.stream().map(e -> e.getText()).collect(Collectors.toList());
集合,对其进行迭代,然后(使用aList
)将文本推入.getText()
。
话虽如此,我建议我认为这是一种更有效的方法。从您发布的代码来看,aListStrings
和aList
看起来是相同的元素集合。在这种情况下,您不需要同一列表的两个实例。另外,由于您似乎想从同一个元素中收集alt属性和文本,因此我将它们存储在一起,以便您可以同时轻松访问这两个属性。
鉴于所有这些,我将更像编写代码
bList
我根据您的示例创建了一个简单的HTML文件,
// store all the elements in a single variable List
List<WebElement> elements = driver.findElements(By.xpath("//something"));
// initialize a List that will contain the pair of strings,alt text and the contained text
List<Pair<String,String>> list = new ArrayList<Pair<String,String>>();
// use a .stream() to map the alt text and contained text values into the Pair instance and return as a list
list = elements.stream().map(e -> new Pair<String,String>(e.getText(),e.getAttribute("alt"))).collect(Collectors.toList());
for (Pair<String,String> pair : list)
{
// do something with those values
System.out.println(pair.getKey() + "," + pair.getValue());
}
当我运行上面的代码时,在模拟的HTML上输出
<b alt="EN">some EN text</b>
<b alt="DE">some DE text</b>
<b alt="ES">some ES text</b>
我添加了打印代码的代码,作为如何访问两个值的示例。您可以删除它,并在循环内对其进行任何处理。
,如果我理解您的问题,仅以下一行就足够了。
List<String> blist = driver.findElements(By.xpath("//something")).stream().map(a->a.getAttribute("alt")).collect(Collectors.toList());
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。