【问题标题】:Selenium By.className() -> IndexOutOfBoundsException: Index: 0, Size: 0Selenium By.className() -> IndexOutOfBoundsException:索引:0,大小:0
【发布时间】:2019-07-19 06:35:31
【问题描述】:

我正在为网站编写自动化应用程序。因此,我需要使用没有 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

【问题讨论】:

  • 似乎没有返回该特定类名的元素
  • 是什么让你认为By.className() 比 CSS 选择器更快?你在哪里看到 CSS 选择器不快? “不工作”不是很具有描述性。编辑您的问题并发布实际的错误消息。你的问题标题不是问题......你也应该解决这个问题。
  • 您将遇到的一个错误是“gLFyf gsfi”不是类名......它实际上是两个类名,“gLFyf”和“gsfi”,所以你不能使用它在By.className() 中,否则您将收到有关复合类名称的错误。您必须选择其中一个或使用 CSS 选择器 By.cssSelector(".gLFyf.gsfi")

标签: java selenium browser-automation


【解决方案1】:

如果该类名正确且稳定(在我看来它是生成的,这意味着每次加载页面时都会有不同的类名,这种更改会破坏您的脚本),我建议使用

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

如另一个答案所示,By.className() 可能被您的类名中的空格弄糊涂了。

【讨论】:

    【解决方案2】:

    首先,让我解决“xPath 和 CSS 选择器不是那么快”的说法。它们慢了 纳秒,也许!如果您有兴趣了解更多信息,请阅读here

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多