Селен: NoSuchElementException в Internet Explorer

Я пытаюсь перенести сценарий Selenium для внутреннего Webapp из Selenium IDE в настройку Selenium Grid с RemoteWebDrivers на Java.

Скрипты отлично работают с Chrome и Firefox, но не с Internet Explorer. Каждый раз, когда я пытаюсь найти элемент на странице, я получаю только исключение NoSuchElementException (сама страница загружается нормально).

Пример кода, который демонстрирует такое же поведение на странице Википедии:

public class Wikipedia_test_IE {
 private WebDriver driver = null;
 private String baseUrl = null;
 private boolean acceptNextAlert = true;
 private StringBuffer verificationErrors = new StringBuffer();


 @Before
 public void setUp() throws Exception {
//      DesiredCapabilities cap = DesiredCapabilities.firefox();
 DesiredCapabilities cap = DesiredCapabilities.internetExplorer();
 cap.setCapability(CapabilityType.VERSION, "9");

        driver = new RemoteWebDriver (new URL("http://192.168.1.230:4444/wd/hub"), cap);    
        baseUrl = "https://en.wikipedia.org/wiki/Rosetta_%28spacecraft%29";
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
 }

 @Test
 public void testAKTargobankTestfall1KN() throws Exception {
      driver.get(baseUrl);
      driver.findElement(By.linkText("space probe")).submit();
 }
}

Я пробовал использовать findElement (By.Id) и findElement (By.cssSelector) - никакого эффекта. Задержка между загрузкой страницы и выбором также не имеет никакого эффекта, равно как и использование щелчка вместо отправки.

Я включил ведение журнала отладки драйвера IE, но выходные данные не помогают мне понять, в чем может быть проблема - надеюсь, кто-то другой сможет.

server.cc(239) Command: POST /session {"desiredCapabilities":{"platform":"WINDOWS","ensureCleanSession":true,"browserName":"internet explorer","version":"9"}}
IESession.cpp(43) Mutex acquired for session initalization
IESession.cpp(105) Releasing session initialization mutex
command.cc(33) Raw JSON command: { "command" : "newSession", "locator" : { }, "parameters" : {"desiredCapabilities":{"platform":"WINDOWS","ensureCleanSession":true,"browserName":"internet explorer","version":"9"}} }
BrowserFactory.cpp(68) Ignoring Protected Mode Settings: 0
BrowserFactory.cpp(71) Checking validity of Protected Mode settings.
BrowserFactory.cpp(984) Detected IE version: 9, detected Windows version: 6
BrowserFactory.cpp(1074) Found Protected Mode setting value of 0 for zone 1
BrowserFactory.cpp(1074) Found Protected Mode setting value of 0 for zone 2
BrowserFactory.cpp(1074) Found Protected Mode setting value of 0 for zone 3
BrowserFactory.cpp(1074) Found Protected Mode setting value of 0 for zone 4
BrowserFactory.cpp(74) Has Valid Protected Mode Settings: 1
BrowserFactory.cpp(170) Starting IE using the IELaunchURL API
BrowserFactory.cpp(124) IE launched successfully with process ID 2188
BrowserFactory.cpp(130) Process with ID 2188 is executing iexplore.exe
BrowserFactory.cpp(313) Ignoring zoom setting: 0
BrowserFactory.cpp(581) Browser zoom level is 100%
IECommandExecutor.cpp(650) Persistent hovering set to: 1
ProxyManager.cpp(118) Using existing system proxy settings.
server.cc(308) Response: {"sessionId":"4aba017b-91e9-4f48-9f9f-f38b0464bb6b","status":303,"value":"/session/4aba017b-91e9-4f48-9f9f-f38b0464bb6b"}


server.cc(239) Command: GET /session/4aba017b-91e9-4f48-9f9f-f38b0464bb6b {}
command.cc(33) Raw JSON command: { "command" : "getSessionCapabilities", "locator" : { "sessionid" : "4aba017b-91e9-4f48-9f9f-f38b0464bb6b" }, "parameters" : {} }
IECommandExecutor.cpp(544) No alert handle is found
server.cc(308) Response: {"sessionId":"4aba017b-91e9-4f48-9f9f-f38b0464bb6b","status":0,"value":{"browserAttachTimeout":0,"browserName":"internet explorer","cssSelectorsEnabled":true,"elementScrollBehavior":0,"enableElementCacheCleanup":true,"enablePersistentHover":true,"handlesAlerts":true,"ie.browserCommandLineSwitches":"","ie.ensureCleanSession":false,"ie.forceCreateProcessApi":false,"ie.usePerProcessProxy":false,"ignoreProtectedModeSettings":false,"ignoreZoomSetting":false,"initialBrowserUrl":"http://localhost:15278/","javascriptEnabled":true,"nativeEvents":true,"platform":"WINDOWS","requireWindowFocus":false,"takesScreenshot":true,"unexpectedAlertBehaviour":"dismiss","version":"9"}}

server.cc(239) Command: POST /session/4aba017b-91e9-4f48-9f9f-f38b0464bb6b/timeouts/implicit_wait {"ms":30000}
command.cc(33) Raw JSON command: { "command" : "implicitlyWait", "locator" : { "sessionid" : "4aba017b-91e9-4f48-9f9f-f38b0464bb6b" }, "parameters" : {"ms":30000} }
IECommandExecutor.cpp(544) No alert handle is found
server.cc(308) Response: {"sessionId":"4aba017b-91e9-4f48-9f9f-f38b0464bb6b","status":0,"value":null}

server.cc(239) Command: POST /session/4aba017b-91e9-4f48-9f9f-f38b0464bb6b/url {"url":"https://en.wikipedia.org/wiki/Rosetta_%28spacecraft%29"}
command.cc(33) Raw JSON command: { "command" : "get", "locator" : { "sessionid" : "4aba017b-91e9-4f48-9f9f-f38b0464bb6b" }, "parameters" : {"url":"https://en.wikipedia.org/wiki/Rosetta_%28spacecraft%29"} }
IECommandExecutor.cpp(544) No alert handle is found
Browser.cpp(421) Navigate Events Completed.
Browser.cpp(452) Browser ReadyState is not '4', indicating 'Complete'; it was 1
Browser.cpp(421) Navigate Events Completed.
Browser.cpp(437) Browser busy property is true.

(Последние две строчки повторяются несколько раз)

ElementRepository.cpp(107) Refreshing managed element cache. Found 0 to remove from cache.
Browser.cpp(421) Navigate Events Completed.
Browser.cpp(476) Waiting for document to complete...
Browser.cpp(481) Not in navigating state
server.cc(308) Response: {"sessionId":"4aba017b-91e9-4f48-9f9f-f38b0464bb6b","status":0,"value":null}

server.cc(239) Command: POST /session/4aba017b-91e9-4f48-9f9f-f38b0464bb6b/element {"using":"link text","value":"space probe"}
command.cc(33) Raw JSON command: { "command" : "findElement", "locator" : { "sessionid" : "4aba017b-91e9-4f48-9f9f-f38b0464bb6b" }, "parameters" : {"using":"link text","value":"space probe"} }
IECommandExecutor.cpp(544) No alert handle is found
ElementFinder.cpp(49) Using FindElement atom to locate element having linkText = space probe
Browser.cpp(114) No child frame focus. Focus is on top-level frame
Script.cpp(485) -2147024891 [Zugriff verweigert]: Unable to execute code, call to IHTMLWindow2::execScript failed
Script.cpp(171) Cannot create anonymous function
ElementFinder.cpp(84) Unexpected error attempting to find element by mechanism linkText with criteria space probe

Любые идеи?


person Christoph Gösgens    schedule 12.08.2014    source источник
comment
Я полагаю, вы используете IE9? Эта ошибка звучит так, будто выполнение JS каким-то образом предотвращается. Может проверить настройки безопасности? Также проверить, что это происходит на другом сайте? Возможно, попробуйте использовать селектор CSS в консоли разработчика IE, чтобы убедиться, что что-то столь же базовое действительно работает?   -  person Arran    schedule 13.08.2014


Ответы (5)


Спасибо за помощь. Чтобы ответить на некоторые из упомянутых выше вопросов, которые я должен был включить в исходный пост:

- Да, это действительно IE 9 - Я уже включил защищенный режим во всех зонах безопасности - использование щелчка вместо отправки не имело значения (изначально)

Так уж получилось, что виртуальная машина, на которой запущен узел Selenium, применила обновления безопасности в течение ночи, в том числе и для IE.

Сначала у меня появилось другое сообщение об ошибке, чем раньше - IE не смог найти только что открывшееся окно браузера, и окна тоже не были закрыты. Все настройки безопасности были сброшены обновлением.

После повторного включения защищенного режима все работает. Как заметил Ричард, мне действительно нужно было изменить элемент поиска на .click () вместо .submit ().

Итак, теперь все работает, и я понятия не имею, почему. Спасибо еще раз!

person Christoph Gösgens    schedule 13.08.2014

Вероятно, вам следует использовать click(), а не submit():

driver.findElement(By.linkText("space probe")).click();
person Richard    schedule 12.08.2014

У меня также была эта ошибка на тестах, которые отлично работали в FF, но не в IE.

Могу предложить вам:

  • Проверить настройки защищенного режима в IE.
  • Чтобы отключить собственные события в драйвере IE.
  • Использовать JavaScript в этих конкретных случаях (худший, с моей точки зрения).

Это известная проблема с драйвером IE.

http://jimevansmusic.blogspot.be/2012/08/youre-doing-it-wrong-protected-mode-and.html http://jimevansmusic.blogspot.be/2013/01/revisiting-native-events-in-ie-driver.html

person Quiro    schedule 12.08.2014

Попробуйте использовать InternetExplorerDriver вместо RemoteWebDriver. Обычно это не имеет значения, но с IE все возможно -.-

У меня похожие проблемы, и я получаю следующий код, который мне подходит:

@Before
public void setUp() {
   //... some irrelevant Code ... 

   System.setProperty("webdriver.ie.driver", "Path to IEDriver.exe");
   InternetExplorerDriver driver = new InternetExplorerDriver();

   //... some irrelevant Code ...
}
person Pascal    schedule 13.08.2014

Вы можете написать свой код следующим образом:

while(true) {
    try {
        driver.findElement(By.linkText("space probe")).submit();
        break;
    } catch (Exception e) {
        continue;
    }
}

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

person Aniket Samanta    schedule 12.09.2015