方法不可用,需要“不必要的”重写吗?

问题描述

我有这两个Selenium / Java调用:

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上一样在一行中完成所有这些操作,那就更好了。

要澄清:

  1. 这主要是Java语法问题。
  2. 有关其外观的示例。我有几个与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()

话虽如此,我建议我认为这是一种更有效的方法。从您发布的代码来看,aListStringsaList看起来是相同的元素集合。在这种情况下,您不需要同一列表的两个实例。另外,由于您似乎想从同一个元素中收集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()); 

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...