即使元素已在Google主页上等待,“ ElementNotVisibleException:元素不可交互”错误也无法找到Google搜索按钮

时间:2019-04-16 17:14:21

标签: c# selenium selenium-webdriver webdriver webdriverwait

所以我有一个Selenium测试,它在按钮与按钮交互之前等待按钮加载。

从我的代码中可以看到,我已经实现了它,以便驱动程序将等待14秒(14是一个随机数),或者如果元素位于14秒之前它将继续运行。

但是,即使在我等待元素加载并尝试与之交互(使用Click()方法)之后,我仍然收到此错误,表明该元素不可交互。

有趣的是,它实际上有时可以工作-元素确实是可交互的-但有时却不起作用。

public void TestChromeDriverMinimalWaitTime()
        {
            driver.Navigate().GoToUrl("http://www.google.com");
            //find search bar and enter text
            driver.FindElement(By.Name("q")).SendKeys("Selenium");
            //wait 14 seconds max..
            WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(14));
            //...unless button element is found
            IWebElement waitUntil = wait.Until(x => x.FindElement(By.Name("btnK")));
            //once found, click the button
            waitUntil.Click();
            //wait 4 secs till this test method ends
            Thread.Sleep(2000);
        }

这是我得到的错误: 第53行是这样的行: waitUntil.Click();

enter image description here

根据@DebanjanB的答案修订的工作代码:

public void TestChromeDriverMinimalWaitTime()
        {
            driver.Navigate().GoToUrl("http://www.google.com");
            //find search bar and enter text
            driver.FindElement(By.Name("q")).SendKeys("Selenium");
            //wait 14 seconds max..unless button element is found
            IWebElement element = new WebDriverWait(driver, TimeSpan.FromSeconds(14)).Until(ExpectedConditions.ElementToBeClickable(By.Name("btnK")));    
            //click enter
            element.SendKeys(Keys.Return);
            Thread.Sleep(2000);
        }

3 个答案:

答案 0 :(得分:1)

有时它可以正常工作,这似乎是时间问题。也许该元素开始是禁用的,并在一些微小的延迟或事件后启用。尝试在.Click之前添加延迟。您还可以检查按钮元素的状态,以查看其是否被禁用。

答案 1 :(得分:0)

您可以尝试使用以下代码检查页面中某个元素的可见性。

public void TestChromeDriverMinimalWaitTime()
        {
            driver.Navigate().GoToUrl("http://www.google.com");
            //find search bar and enter text
            driver.FindElement(By.Name("q")).SendKeys("Selenium");

            //...unless button element is found
           while(!IsElementVisible(driver.FindElement(By.Name("btnK"))){
                  Thread.Sleep(1000);
                  }
            //once found, click the button
            waitUntil.Click();
            //wait 4 secs till this test method ends
            Thread.Sleep(2000);
        }

public bool IsElementVisible(IWebElement element)
{
    return element.Displayed && element.Enabled;
}

答案 2 :(得分:0)

从您的代码试用开始,您似乎正在尝试在按钮上调用Google Home Page上的文本为 Google搜索click()

您采用的引发 WebDriverWait 的方法非常完美。但是,如果您分析HTML DOM,则会发现经过调整的locator strategy可以标识DOM Tree中的多个(两个)元素。因此, locator 不能唯一地标识所需的元素。执行期间,定位器会标识不可见的另一个元素。因此,您看到的错误为:

ElementNotVisibleException: element not interactable

解决方案

这里最简单的方法是将您标识为搜索框

driver.FindElement(By.Name("q")).SendKeys("Selenium");

位于表单中,一旦发送了搜索文本,您就可以使用以下任一解决方案:

  • 发送Keys.Return如下:

    IWebElement element = new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(By.Name("q")));
    element.SendKeys("Selenium");
    element.SendKeys(Keys.Return);
    
  • 发送Keys.Enter如下:

    IWebElement element = new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(By.Name("q")));
    element.SendKeys("Selenium");
    element.SendKeys(Keys.Enter);