单击不幸包含 link 的标签元素

Clicking label element that unfortunately contains a link

我 运行 遇到了一个问题,我试图点击一个复选框。该应用程序是用 AngularJS.

编写的

无法单击复选框,因为从技术上讲该元素是不可见的。使用 'visible: false' 无助于选中此框。我也尝试过使用 element.set(true)

复选框位于标签元素内,该标签元素恰好也包含超链接。由于 Capybara/Selenium 默认情况下点击元素的中间,我最终打开超链接而不是标记复选框。单击标签中的任意位置(超链接外部)成功选中该框。

我怎样才能做到这一点?

我建议使用 JavascriptExecutor 来点击元素。如果元素在技术上不可见,Webdriver 将不允许您使用 API 单击它,因为它会尝试模拟真实的用户操作。不过你可以选择直接执行 JS,这并不重要。

此答案将帮助您完成代码部分:

您需要将结尾稍微更改为:

JavascriptExecutor js = (JavascriptExecutor) driver;
WebElement element = driver.findElement(By.xpath("exact_locator_of_checkbox"));
js.executeScript("arguments[0].click()",element);

当然不需要只使用 xpath,而是任何可以帮助您直接指向复选框的东西。

花了我一些时间,但我发现我可以避免水豚 API 并使用 WebDriver 的 ActionBuilder。

def agree
  source = find('label.terms-label').native
  actionbuilder = page.driver.browser.action
  actionbuilder.move_to(source, 0, 0).click.perform
end

默认情况下,Capybara API(以及其他本机 Selenium 方法)将在元素的中心单击。这将避免这种情况,并会找到该元素并在 (0, 0) 坐标处单击它。

从 Capybara 3.0.0 开始,您可以在对元素调用 click 时指定偏移量。所以如果你想点击元素框的左上角,你会说:

find('label.terms-label').click(x: 0, y: 0)

(请注意,如果指定,则必须指定 :x:y