Перейти к содержимому

1Aleksandrmd1

Регистрация: 21 июн 2017
Offline Активность: 29 янв 2018 17:43
-----

Мои темы

Переход во фрейм

20 октября 2017 - 06:33

Добрый день!

Тесты работают в IE. Возникла следующая проблема:

после нажатия на кнопку, открывается окно с фреймами,  перехожу в это окно в нем DOM такого формата 

<HTML>
<HEAD>
<TITLE>Testin</TITLE>
<META content="text/html; charset=Windows-1251" http-equiv=Content-Type>
</HEAD>
<FRAMESET cols=100%>
<FRAME src="https://localhost:9000/Test/close.do?newWindow=true" frameBorder=0>
</FRAMESET>
</HTML>

Перехожу во фрейм  driver().switchTo().frame(0); но получаю пустой ДОМ. Слипы в реальном коде не использую, делаю таким образом только для отладки и наглядности. 

...
LOG.info("Test1\n"+driver().getPageSource());
driver().switchTo().defaultContent();
driver().switchTo().activeElement();
driver().manage().window().maximize();
Thread.sleep(1000);
driver().switchTo().frame(0);
Thread.sleep(2000);
LOG.info("Test2\n'"+driver().getPageSource()+"'");
...     

В итоге лог выводится строка Test2 с пустым ДОМом. Приложение естественно рабочее по факту код страницы формируется 

<HTML>
<HEAD>
<TITLE>Testing</TITLE>
<META content="text/html; charset=Windows-1251" http-equiv=Content-Type>
</HEAD>
<FRAMESET cols=100%>
<FRAME src="https://localhost:9000/Test/close.do?newWindow=true" frameBorder=0>
<html>
<head>
<body style="margin: 0px; padding: 0px;">
<iframe frameborder="0" src="/Test/close.do?newWindow=true" scrolling="auto" style="position: absolute; height: 100%; width: 100%;">
...
</FRAMESET>
</HTML>

Я так догадываюсь из-за прямой ссылки src="https://localhost:90...?newWindow=true". Вопрос есть ли красивый способ решение данной проблемы? Пока в голову пришли только не красивые грабли. Получение ссылки src, закрытие текущего окна, открытие нового, вставка туда урла и уже работа с iframe. Такой способ рабочий но он плохой так как я вмешиваюсь в реализацию, могу упустить с таким подходом ошибки.


Почему возникает плавающая ошибка InvalidSelectorException

15 августа 2017 - 07:07

Добрый день!

 

У меня возникает следующая проблема.Возникает плавающая ошибка  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 не корректно отрабатывает.