1

Я пытаюсь взломать щелчок мышью с помощью Internet Explorer. Моя цель состоит в том, чтобы иметь один метод, который я могу использовать, который сначала попробует нормальный Click(), и если он не сработает, то сделает SendKeys("\n"), который, кажется, является общепринятым обходным решением.Почему Selenium WebDriver не находит мой элемент в объявлении catch

Это моя попытка

public void ClickByCssSelectorIeSafe(string cssSelector) 
{ 
    try 
    { 
     _driver.FindElement(By.CssSelector(cssSelector)).Click(); 
    } 
    catch (WebDriverException) 
    { 
     _driver.FindElement(By.CssSelector(cssSelector)).SendKeys("\n"); 
    } 
} 

Когда щелчок преуспевает все работает, но когда я получаю WebDriverException в предложении попробуйте сделать FindElement в предложении поймать не удается, даже если ей это удалось в предложении Try. Зачем?

Еще один интересный момент заключается в том, что в некоторых случаях я вижу, как Click() преуспевает в браузере, но он по-прежнему выдает исключение и попадает в предложение catch.

Я хочу этого, потому что мы запускаем наши тесты в Chrome, Firefox и IE, и я не хочу, чтобы IE hack применялся повсюду.

Сообщение об исключении для неисправного FindElement в предложении поймать выглядит следующим образом

A first chance exception of type 'OpenQA.Selenium.WebDriverException' occurred in WebDriver.dll 

Additional information: The HTTP request to the remote WebDriver server for URL 
http://localhost:58124/session/21337088-7630-4709-a902-0a5d1bc7a669/element timed out after 60 seconds. 

Сообщение об исключении для неисправной мыши в предложении Ьги выглядит как этот

A first chance exception of type 'OpenQA.Selenium.WebDriverException' 
occurred in WebDriver.dll 

Additional information: The HTTP request to the remote WebDriver server for URL 
http://localhost:58124/session/21337088-7630-4709-a902-0a5d1bc7a669/element/bcee1534-00e6-4155-b4cc-7171db39f112/click timed out after 60 seconds. 
+1

Я думаю, вы обнаружите, что исключенное исключение на самом деле связано с тем, что элемент не найден, а не потому, что щелчок не работает. Имея это в виду, имеет смысл, что он также не может найти элемент в блоке catch. –

+0

@Steve, если я просто запускаю то, что находится в блоке catch сразу, это работает. –

ответ

1

В итоге я нашел это в журнале: D 2015-04-27 14:01:08:497 Browser.cpp(379) Browser busy property is true., который ведет меня в правильном направлении.

Проблема, с которой я сталкиваюсь, состоит в том, что страница занята и не позволяет мне взаимодействовать с ней. Я нашел предложение here установить тайм-аут загрузки страницы и обработать (проглотить) исключение, если это произойдет. Это сработало.

Другими словами, если страница занята, я просто проглатываю исключение, и если клик не удался по какой-либо другой причине, я делаю взлом SendKeys("\n").

Так что, когда я инициализировать свой драйвер я:

driver.Manage().Timeouts().SetPageLoadTimeout(TimeSpan.FromSeconds(5)); 

И мой метод расширения теперь выглядит следующим образом:

public static void ClickWithIeHackFailover(this IWebElement element) 
    { 
     try 
     { 
      element.Click(); 
     } 
     catch (WebDriverException e) 
     { 
      if (e.Message != "Timed out waiting for page to load.") 
      { 
       element.SendKeys("\n"); 
      } 
     } 
    } 

Благодаря @ user903039 помог мне найти проблему.

1

Попробуйте изменить свой код ниже, чтобы выделить проблему.

public void ClickByCssSelectorIeSafe(string cssSelector) 
{ 
    IWebElement element = null; 
    try 
    { 
     element = _driver.FindElement(By.CssSelector(cssSelector)); 
     element.Click(); 
    } 
    catch (NoSuchElementException e) 
    { 
     Console.WriteLine("element not found. {0}", e.Message); 
     //do something here when your element is not found 
    } 
    catch (WebDriverException e) 
    { 
     if (element != null) element.SendKeys("\n"); 
    } 
} 

Теперь вы узнаете, выбрано ли исключение при поиске элемента или при нажатии на него и по-прежнему можно обрабатывать оба случая.

Однако, похоже, что вы получаете проблемы с таймаутом в обоих случаях, что говорит о том, что браузер/AUT зависает/не отвечает. Проверьте журналы сервера и узлов селена для получения дополнительной информации, чтобы узнать, что произошло до того, как будет выбрано исключение.

+0

Спасибо, я инициализировал элемент null, чтобы скомпилировать код. Это дает мне несколько другое сообщение об ошибке, но оно все еще из 'element.SendKeys (" \ n ")'. Новое сообщение: «HTTP-запрос к удаленному серверу WebDriver для URL-адреса http: // localhost: 63046/session/9a7df226-3f65-491d-a874-75b64dd83068/element/e4cff498-22ab-494f-b20f-384d961baf27/время ожидания через 60 секунд. Еще одна интересная вещь: я вижу, что щелчок преуспел в браузере. –

+0

@JohanGov Похоже, что новое исключение относится к следующей строке тестового кода. Как вы говорите, щелчок успешно завершается, и, следовательно, выполняется следующая строка в вашем тесте. **/e4cf f498-22ab-494f-b20f-384d961baf27/value ** в сообщении об исключении указывает, что он пытается получить значение элемента, возможно, текстовое поле? – raluru