Ошибка ElementNotVisibleException: элемент не взаимодействует при поиске кнопки поиска Google, хотя элемент ожидался на главной странице Google - PullRequest
1 голос
/ 16 апреля 2019

Итак, у меня есть тест 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 ]

1 голос
/ 16 апреля 2019

Иногда это работает, похоже на проблему синхронизации.Возможно, элемент вначале отключен и активируется после небольшой задержки или события.Попробуйте добавить задержку перед .Click.Вы также можете проверить состояние элемента кнопки, чтобы убедиться, что он отключен.

0 голосов
/ 16 апреля 2019

Из ваших испытаний кода кажется, что вы пытаетесь вызвать click() на кнопке с текстом Поиск Google на главной странице Google .

ВашПодход WebDriverWait был просто идеальным.Но если вы проанализируете HTML DOM , то найдете стратегию locator , которую вы адаптировали, чтобы идентифицировать несколько (два) элементов в 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);
    
0 голосов
/ 16 апреля 2019

Вы можете попытаться проверить видимость элемента на странице, используя приведенный ниже код.

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...