Добрый день!
У меня возникает следующая проблема.Возникает плавающая ошибка InvalidSelectorException, что само по себе странно.
Использую:
selenium 2.53.0
IE 11
драйвер: IEDriverServer_Win32_3.4.0
Я получаю плавающую ошибку:
org.openqa.selenium.InvalidSelectorException: Unable to locate an element with the xpath expression .//input[@value='Очистить'] because of the following error:
Error: Разрешение отклонено (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 62 milliseconds
For documentation on this error, please visit: http://seleniumhq.or..._exception.html
Build info: version: '2.53.0', revision: '35ae25b1534ae328c771e0856c93e187490ca824', time: '2016-03-15 10:43:46'
System info: host: 'DF3-131016-NE03', ip: '10.80.16.134', os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.8.0_102'
Driver info: org.openqa.selenium.ie.InternetExplorerDriver
Соответственно элемент на странице существует, более того driver().getPageSource() возвращает во время ошибки:
... <TD> <INPUT class=btn onclick="getSubmit('dcForm', 'clear')" type=button value=Очистить> </TD> ...
При явном ожидании элемента, периодически получаю InvalidSelectorException, NoSuchElementException в зависимости от ожидания
Попробовал реализовать самостоятельное ожидание
public WebElement findElementTo(By xpath, int timout){ long deadLine = DateManager.getCurrentTimestamp() + (timout*1000); while(deadLine > DateManager.getCurrentTimestamp()){ try{ WebElement WebElement= find(xpath); return WebElement; }catch(Exception e){ LOG.info("Ошибкак при получении элемента\n"+Init.getWebDriver().getPageSource()+"\n"+e); } } WebElement WebElement= find(xpath); return WebElement; } private WebElement find(By xpath) throws InvalidSelectorException{ WebElement WebElement = Init.getWebDriver().findElement(xpath); if(WebElement.isDisplayed()){ return WebElement; } throw new org.openqa.selenium.ElementNotVisibleException("Элемент не виден. Xpath="+xpath+"\n\n\n"); }
Соответственно постоянно идет обращение к получению элемента и в течении 10 мин я могу получать ошибку InvalidSelectorException. Замечу это не регулярная ошибка, она периодически возникает на разных элементах.
На странице используются AJAX запросы
Как решение проблемы, делаю такие грабли
public void waitForJQueryLoad(long timeout) { WebDriverWait wait = new WebDriverWait(Init.getWebDriver(), timeout); wait.until(new ExpectedCondition<Boolean>(){ @Override public Boolean apply(WebDriver driver){ Boolean active = false; JavascriptExecutor js = null; try{ js = ((JavascriptExecutor)driver); active = (Boolean)js.executeScript("return $j.active == 0"); }catch(WebDriverException e){ LOG.info("Ошибка драйвера:\n"+e); } LOG.info("$.active="+active); return active; } }); try { //Таймаут необходим, для отрисовки элементов DOM, после JQuery запросов. Thread.sleep(250); } catch (InterruptedException e) { // TODO Автоматически созданный блок catch e.printStackTrace(); }
То есть дожидаюсь что бы все AJAX запросы были выполнены и жду построения ДОМ в течении 0,25 сек
Но возникает 3 вопроса
1) почему возникает именно ошибка InvalidSelectorException - она же означает, что xpath не валидный, либо возвращается не WebElement, а текст к примеру
в нашем случае тут явно WebElement
2) Единственно, я могу предположить, что ДОМ не успел до строиться,например странно (value=Очистить - почему то без кавычек), но тогда почему при последующих запросах, получения того же элемента WebElement WebElement= find(xpath);, ДОМ не перестраивается для драйвера? То есть если в текущем тесте получили InvalidSelectorException, то она так и появляется, пока таймаут не закончится. (Приложение отрабатывает корректно)
3) Может не корректная конфигурация?
Хочется понять в связи с чем такого рода ошибки. Пока мысли, что драйвер для IE не корректно отрабатывает.