【问题标题】:How to click an element which is invisible in Selenium WebDriver?如何单击 Selenium WebDriver 中不可见的元素?
【发布时间】:2016-06-23 14:57:21
【问题描述】:

我想单击一个单选按钮,但有时会出现“不可见元素”异常。我使用了 Thread.Sleep() 函数,但没有使用。它有时并不总是发生。我通常可以使用 selenium 网络驱动程序单击单选按钮

wd.FindElement(By.XPath("//input[@value=2]")).Click();

【问题讨论】:

  • 你能给我们stacktrace吗?还是抛出的确切异常?
  • 这里的问题是网页元素的不可见性。问题是找不到特定的网络元素
  • {OpenQA.Selenium.ElementNotVisibleException: 元素不可见
  • 那么需要做什么才能让它可见?用户需要做什么才能使该元素可见并能够使用它?

标签: c# .net selenium selenium-webdriver


【解决方案1】:

当想要点击隐藏元素时,使用 javascript 是一个不错的选择。 Selenium 不能对隐藏元素执行操作(即单击)。 javascript 函数有两种选择:

  1. 第一个将实际模拟点击

    ((IJavaScriptExecutor)wd).ExecuteScript("arguments[0].click();", wd.FindElement(By.XPath("//input[@value=2]")));
    
  2. 第二个将简单地触发点击发生时应该发生的事件。

    ((IJavaScriptExecutor)wd).ExecuteScript("arguments[0].trigger('click');", wd.FindElement(By.XPath("//input[@value=2]")));
    

【讨论】:

  • 这是我见过的少数几个答案之一!
【解决方案2】:

在检查时它实际上是不可见的吗?即你需要等待它。您可以使用 WebDriverWait 等待它变得可见。

例如

WebDriverWait wait = new WebDriverWait(driver, new TimeSpan(0,0,5));
wait.Until(w=>w.FindElements(By.XPath("//input[@value=2]")).Any());

【讨论】:

  • 我使用 Thra.Sleep(2000) 等待 2 秒,但没有。有什么区别
  • 是的,WebDriverWait 让您等到某个条件发生,例如元素变得可见。
  • 那么您是否查看了浏览器中执行此行时的页面元素?
【解决方案3】:

您可以尝试通过javascript使其可见,然后单击后使其变为不可见:

IWebElement element = Driver.FindElement(By.XPath("//input[@value=2]"))
((IJavaScriptExecutor)Driver).ExecuteScript("arguments[0].hidden = false;", element);
element.click
((IJavaScriptExecutor)Driver).ExecuteScript("arguments[0].hidden = true;", element);

将其包装在扩展方法中,并在需要时使用

public static IWebElement ClickOnInvisibleElement(this IWebDriver Driver, By by)
{
     IWebElement element = Driver.FindElement(by))
     ((IJavaScriptExecutor)Driver).ExecuteScript("arguments[0].hidden = false;", element);
     element.click
     ((IJavaScriptExecutor)Driver).ExecuteScript("arguments[0].hidden = true;", element);
     return element;
}

Driver.ClickOnInvisibleElement(By.XPath("//input[@value=2]"));

【讨论】:

  • 这甚至是有效的 Javascript 吗?
  • 哎呀抱歉,打错字了,我写得很快,赶时间,已编辑
【解决方案4】:

我非常喜欢@JustinHarvey 的回答——因为通常元素不可见是有原因的,而且往往只是需要设法让它变得可见。他的脚本对我不起作用,但是当我稍微修改后它就可以了。

 WebDriverWait wait = new WebDriverWait(driver, new TimeSpan(0, 0, 5));
 wait.Until(w => driver.FindElements(By.CssSelector("[type='submit']")).ToList().Any(o => o.Displayed));

希望这可以为您节省一些时间。

【讨论】:

    【解决方案5】:

    当您通过XPathIdClass 定位元素时,有时在之前的操作之后加载新的HTML 页面需要更多时间。在这种情况下,您只需在Thread.Sleep(time); 上投入更多时间逃离异常。 您可以使用以下代码(C#)等待元素出现:

    Thread.Sleep(10000);
    WebDriverWait wait = new WebDriverWait(WebDriver, TimeSpan.FromSeconds(30));
    IWebElement element= wait.Until<IWebElement>((d) =>
    {
       return d.FindElement(By.Id("elementID"));
    });
    element.Click();
    

    使用IJavaScriptExecutorC#)点击元素的另一种方式:

    IWebDriver webDriver;
    IWebEelement webElement = webDriver.findElement(By.XPath(Element xpath));
    IJavaScriptExecutor executor = (IJavaScriptExecutor)webDriver;
    executor.ExecuteScript("arguments[0].click();", webElement );
    

    Java中的代码几乎相同。

    希望对你有帮助。

    【讨论】:

      【解决方案6】:

      使用 java 脚本执行器来发挥作用。

       ((JavascriptExecutor) webdriver).executeScript("document.getElementById('btn')[0].click
      

      阅读本文了解更多详情:http://www.anitpatel.net/2012/02/25/selenium-webdriver-how-to-click-on-a-hidden-link-or-menu/

      【讨论】:

      • 有两个单选按钮我必须选择其中一个,它们之间的唯一区别是它们的值。它们的名称和类型以及使用 value 选择的相同 ı
      【解决方案7】:

      您的网络驱动程序似乎在单选按钮不可见时尝试单击它。这可能因页面加载速度而异。我建议使用 webdriverWait 等待单选按钮变为可见。您的代码将如下所示:

      var wait = new WebDriverWait(wd, TimeSpan.FromMinutes(1));
      wait.Until(ExpectedConditions.ElementIsVisible(By.XPath("//input[@value=2]")));
      wd.FindElement(By.XPath("//input[@value=2]")).Click();
      

      第一行初始化等待变量。这样做是它使用您的允许等待变量使用您的 webdriver 来等待某些元素,并设置等待多长时间的时间限制(我将等待时间设置为一分钟)。下一行实际上是通过等待 xpath 变得可见来等待单选按钮出现。最后,如果按钮可见,它会单击该按钮。如果 wait.until 命令超过了分配的等待时间,就会抛出异常。

      【讨论】:

      • 你不是说.ElementIsPresent 而不是.ElementIsVisible,就像问的问题暗示的那样吗?
      【解决方案8】:

      我认为问题在于您在获得上一步的答案之前快速进入下一步。 我在时遇到了同样的问题:
      第一步:打开一个窗口
      第二步:点击窗口按钮

      我的问题是 JS 没有足够快地返回数据所以我试图在窗口出现之前按下按钮(所以我得到了“不可见”的错误)

      要解决这个问题,只需将 Thread.sleep(1000) 放入您的代码中。

      【讨论】:

        猜你喜欢
        • 2011-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-30
        • 2015-05-03
        • 2013-12-20
        • 2018-03-14
        相关资源
        最近更新 更多