Selenium By.className() - > IndexOutOfBoundsException:索引:0,大小:0

问题描述 投票:1回答:2

我正在为网站编写自动化应用程序。因此,我需要引导没有ID的HTML元素。我听说xPath和CSS Selector不是那么快,这就是我想要改为By.className()的原因。不幸的是我这不起作用。你可以在下面找到一个Demo(实际的工具不是google:D自动化)。

我使用的是GeckoDriver 0.21.0和Selenium 3.13.0

WebDriver d = new FirefoxDriver();
JavascriptExecutor js = (JavascriptExecutor) d;  
d.get("https://www.google.com");
WebElement we = d.findElements(By.className("gLFyf gsfi")).get(0);
js.executeScript("arguments[0].value='test';", we);

HTML Element

java selenium browser-automation
2个回答
1
投票

如果该类名称正确且稳定(它看起来对我生成,意味着每次加载页面时会有一个不同的类名,一个会破坏你的脚本的更改),我建议使用

WebElement we = d.findElements(By.cssSelector(".gLFyf.gsfi")).get(0);

如另一个答案所示,By.className()可能会被类名中的空格所混淆。


-1
投票

首先,lemme解决声明“xPath和CSS Selector不是那么快”。它们慢了几纳秒,也许!如果您对更多信息感兴趣,请阅读here

接下来你的实际问题。 HTML中的class属性是一个以空格分隔的类名列表。在你的By.className(),你只能使用其中一个。

此外,您正在使用.findElements()(复数形式),并期望只有一个WebElement。编译器可能会告诉你,你应该期待List<WebElement>。然后在你的.executeScript()中,这显然是行不通的,因为那只是期望只有一个元素。你必须在这里解决你真正想要的东西。

© www.soinside.com 2019 - 2024. All rights reserved.