'ElementNotVisibleException:element not interactable' error locating Google Search button even though element was waited for on Google Home Page

与世无争的帅哥 提交于 2019-11-28 14:25:26

From you code trials it seems you are trying to invoke click() on the button with text as Google Search on the Google Home Page.

Your approach inducing WebDriverWait was just perfecto. But if you analyze the HTML DOM you will find the locator strategy which you have adapted identifies multiple (two) elements within the DOM Tree. So the locator doesn't identifies the desired element uniquely. While execution the locator identifies the other element which is not visible. Hence you see the error as:

ElementNotVisibleException: element not interactable

Solution

The easiest approach here is, as the search box which you have identified as:

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

is within a form, once you send the search text you can use either of the following solutions:

  • Sending Keys.Return as follows:

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

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

With it working sometimes, it seems like a timing issue. Perhaps the element starts out disabled, and is enabled after some tiny delay, or an event. Try adding a delay just before .Click. You might also check the state of the button element to see if it is disabled.

You can try to check the visibility of an element in the page using the below code.

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;
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!