我正在为网站编写自动化应用程序。因此,我需要引导没有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);
如果该类名称正确且稳定(它看起来对我生成,意味着每次加载页面时会有一个不同的类名,一个会破坏你的脚本的更改),我建议使用
WebElement we = d.findElements(By.cssSelector(".gLFyf.gsfi")).get(0);
如另一个答案所示,By.className()可能会被类名中的空格所混淆。
首先,lemme解决声明“xPath和CSS Selector不是那么快”。它们慢了几纳秒,也许!如果您对更多信息感兴趣,请阅读here。
接下来你的实际问题。 HTML中的class
属性是一个以空格分隔的类名列表。在你的By.className()
,你只能使用其中一个。
此外,您正在使用.findElements()
(复数形式),并期望只有一个WebElement
。编译器可能会告诉你,你应该期待List<WebElement>
。然后在你的.executeScript()
中,这显然是行不通的,因为那只是期望只有一个元素。你必须在这里解决你真正想要的东西。