在看到某处在JS中用1行编写的相同代码后,我尝试使用Java中的Lambda表达式来减少代码行。但是我收到以下错误:
不兼容的类型。 需要: org.openqa.selenium.logging.LogEntries 发现: 无效
这就是我现在拥有的。
List e =driver.manage().logs().get(LogType.BROWSER).getAll();
String s="",t ="";
if (!e.isEmpty()){
for (Object l : e)
{
t=l.toString();
if(t.contains("SyntaxError")){
s = s + t+"<BR/>";
}
else if(t.contains("EvalError")){
s = s + t+"<BR/>";
}
else if(t.contains("ReferenceError")){
s = s + t+"<BR/>";
}
else if(t.contains("RangeError")){
s = s + t+"<BR/>";
}
else if(t.contains("TypeError")){
s = s + t+"<BR/>";
}
else if(t.contains("URIError")){
s = s + t+"<BR/>";
}
}
这就是我想要达到的目的:
List<String > errorStrings = new ArrayList<>();
errorStrings.add("SyntaxError");
errorStrings.add("EvalError");
errorStrings.add("ReferenceError");
errorStrings.add("RangeError");
errorStrings.add("TypeError");
errorStrings.add("URIError");
LogEntries l = driver.manage().logs().get(LogType.BROWSER).forEach(le -> errorStrings.stream().anyMatch(er -> le.getMessage().contains(er)));
按照下面这行代码编写的是JS:
var jsErrors = Driver.Manage().Logs.GetLog(LogType.Browser).Where(x => errorStrings.Any(e => x.Message.Contains(e)));
请帮助我了解我在做什么错。
-TIA
答案 0 :(得分:0)
您的代码是
LogEntries l = driver.manage().logs().get(LogType.BROWSER)
.forEach(le -> errorStrings.stream()
.anyMatch(er -> le.getMessage().contains(er)));
您的错误消息是
Incompatible types. Required: org.openqa.selenium.logging.LogEntries Found: void
该错误消息告诉您您的赋值语句希望您返回LogEntries
,但它得到的是void
。之所以得到void
,是因为这是Stream.forEach
方法的返回类型。 forEach
方法用于消耗流的所有元素,不返回任何内容。
我认为您要尝试的是过滤一组日志条目并将它们变成LogEntries
对象,对吗?如果是这种情况,我怀疑您想要filter
而不是forEach
。
我不是硒专家,所以我不建议您如何打开Stream<LogEntry> into a
LogEntries`。我假设您可以使用reduce或collect操作,但最好将其作为一个单独的问题提出。