【问题标题】:Selenium chrome driver click() method not always clicking on elementsSelenium chrome 驱动程序 click() 方法并不总是点击元素
【发布时间】:2013-06-14 15:45:26
【问题描述】:

我正在用 c# 编写集成测试,当我在对话框中的某些元素上使用 click() 方法时,什么也没有发生,也没有错误。它将单击对话框内的某些元素,但不会单击其他元素。我想如果它没有正确选择它们,那么它会抛出异常,但它运行顺利并说测试通过了,即使它从未真正点击过按钮。该对话框是一个 iframe。

我认为它可能试图单击尚未显示或未启用的按钮,因此我在 click() 调用之前添加了此按钮:

 _driver.SwitchTo().Frame(_frameElement);
     _wait.Until(d =>
    {
      var shippingInfoButton = d.FindElement(By.CssSelector("input[title ='Info']"));
      return shippingInfoButton.Displayed && shippingInfoButton.Enabled;
    });
       var infoButton = _driver.FindElement(By.CssSelector("input[title ='Info']"));
        ScrollToElement(infoButton);
        infoButton.Click();

再次运行,没有抛出异常,所以我假设它已经找到了元素并且它被显示和启用。

如果您需要更多信息,请告诉我。谢谢

【问题讨论】:

  • 你在哪里点击?据我所知,您只找到了元素?
  • 该行代码的正下方。
  • 我看到你更新了你的问题。
  • 是的,我使用相同的代码块单击同一 _frameElement 中的取消按钮,它工作正常,无法弄清楚为什么它会单击它而不是这个。
  • 我通过使用 javascript click 方法而不是 selenium chrome 驱动程序 .click() 找到了一个临时解决方案,如果你们中的任何人知道为什么会这样并且我不想使用 selenium 方法学习。谢谢。我会在几个小时后发布我的解决方案作为答案。

标签: c# selenium integration-testing


【解决方案1】:

我无法解释为什么 selenium 驱动程序 .click() 方法不会在页面中的某些元素上触发,但在其他元素上不会触发,但我确实找到了解决方案。

使用 IJavaScriptExecutor 您可以使用 javascript 来单击元素,在我的情况下它可以工作。

这是运行 IJavaScriptExecutor 的代码,下面是我的整个方法。

    //IJavaScriptExecutor
    IJavaScriptExecutor js = _driver as IJavaScriptExecutor;

         js.ExecuteScript("arguments[0].click();", infoButton);

    //my whole method for clicking the button and returning the page object
    public ShippingMethodDetailsPageObject SelectShippingMethodInfo()
    {
        _driver.SwitchTo().Frame(_frameElement);
        _wait.Until(d =>
        {
         var shippingInfoButton = d.FindElement(By.CssSelector("input[title='Info']"));
            return shippingInfoButton.Displayed && shippingInfoButton.Enabled;
        });

         var infoButton = _driver.FindElement(By.CssSelector("input[title ='Info']"));
         IJavaScriptExecutor js = _driver as IJavaScriptExecutor;

         js.ExecuteScript("arguments[0].click();", infoButton);
        _driver.SwitchTo().DefaultContent();

        return new ShippingMethodDetailsPageObject(_driver, false);
    }

【讨论】:

  • 这是对我有用的最新 chrome 驱动程序,我尝试了其他所有方法,但仍然无法单击标签元素。非常感谢。 protected static void ClickUsingJS(IWebElement elem) { //var infoButton = CurrentDriver.FindElement(By.CssSelector("input[title ='Info']")); IJavaScriptExecutor js = CurrentDriver as IJavaScriptExecutor; js.ExecuteScript("arguments[0].click();", elem); CurrentDriver.SwitchTo().DefaultContent(); } 这应该被接受为答案。干杯!
  • 这可行,但重要的是要警告这会掩盖潜在错误,如果元素不可点击(一件好事),原生 selenium 点击会引发错误,而这不会。
【解决方案2】:

我遇到了类似的问题。如果是同样的问题,则 ChromeDriver 有问题,由于周围的 div 等原因,它无法单击某些元素。真的有点蹩脚。

一个简单的解决方法是发送 Enter 键,例如element.SendKeys(Keys.Enter)。似乎适用于所有浏览器。

【讨论】:

  • 我要试试这个!感谢您的帮助。
  • 这里需要注意的一点:如果您尝试单击的不是链接或按钮等内容,那么您需要为其添加一个 tabindex 并监听 keyup。
  • 您能详细说明一下吗?问题是自动点击该元素,而不是听其他东西的点击。谢谢。
  • Enter 或空格键单击对我不起作用。顺便说一句,OP 提到的 chrome 驱动程序故障是否有任何链接/github 问题?
  • 这很棒!我们遇到了 Spectron(它使用 WebDriver 和 ChromeDriver)的问题,在切换窗口后点击没有注册。添加.keys("Enter") 就可以了。奇怪的是这个问题会在将近 7 年后出现!
【解决方案3】:

我有一些测试在 Firefox 中一直有效,在 Chrome 中它让我发疯,因为有时它成功通过,有时“.click”不起作用,它会通过测试。

花了很长时间才注意到它,但原因是:我曾经有时将浏览器最小化到 80%,以便能够在我的 IDE 旁边看到浏览器。当我这样做时,“.click”似乎不起作用。

至少对我来说这是个问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    • 2017-04-13
    • 2014-11-30
    • 2012-11-19
    • 2018-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多