这与使用 Selenium 和 Java 的自动化测试有关。
我正在获取列表中一列的所有元素。
在此之后,我想使用流获取上述列表的第一个元素,使用 substring() 仅获取该元素/字符串的前 4 个字符,然后我需要将其存储在 String 变量中以执行进一步的操作。
如果我尝试将其存储在变量中,则会出现以下错误 - “类型不匹配:无法从 void 转换为 String”
public class SeleniumEasyLandingPage {
@FindBy(xpath = "//table/tbody/tr/td[3]")
List<WebElement> assigneeColumn;
public void assigneeColumnOperations() {
// below line is to print all of the elements in above list using stream - this is working fine
assigneeColumn.stream().forEach(s->System.out.println(s.getText()));
// below line is to print only first 4 characters of first element of above list - This is also working fine
assigneeColumn.stream().limit(1).forEach(s->System.out.println("First Element - First Name:"+s.getText().substring(0, 4)));
// below line is to store the above value in a String variable which gives error -
String firstElementName=assigneeColumn.stream().limit(1).forEach(s->System.out.println("First Element - First Name:"+s.getText().substring(0, 4)));
}
}
错误是 - “类型不匹配:无法从 void 转换为 String”
您需要使用
findAny
的 Stream
方法从中获取单个值。
就您而言,您甚至不需要流。只需使用
assigneeColumn.get(0)
即可获取列表的第一个值。
Stream.foreach()
的文档,您会发现此方法接受 Consumer
并返回 void
。
在您的语句中,您尝试将
void
分配给 String
变量
String firstElementName = assigneeColumn.stream().limit(1).forEach(s-> System.out.println(...));
这就是编译器向您发出信号的原因
类型不匹配:无法从 void 转换为 String
如果要检索第一个元素或其前四个字符,只需使用
get()
检索第一个元素,然后将 substring()
应用于结果。
// read first element
String firstElementName2 = assigneeColumn.get(0);
// read first 4 characters of the first element
String firstElementName2 = assigneeColumn.get(0).substring(0, 4);
或者,如果你确实想使用流,你可以写:
// read first element
String firstElementName = assigneeColumn.stream().limit(1).findFirst().orElseThrow(() -> new RuntimeException("No elements found"));
// read first 4 characters of the first element
String firstElementName = assigneeColumn.stream().limit(1).findFirst().orElseThrow(() -> new RuntimeException("No elements found")).substring(0, 4);