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

Публикации fenixx

29 публикаций создано fenixx (учитываются публикации только с 29 марта 2023)



#130796 Нестабильное прохождение тестов.

Отправлено автор: fenixx 27 мая 2014 - 11:27 в Selenium - Functional Testing

Столкнулся с проблемой в ожидании завершения всех Ajax в FireFoxe.

При проверке значения jQuery.active после завершения визуальных Ajax-сов всегда выдает ждал и минуту и больше.

Не могу понять в чем ошибка, то ли в Seleniume то ли в отработке самого Ajax-са. Руками ошибку воспроизвести не могу. 

Подскажите как проверить в чем ошибка?

public void WaitForAjax(IWebDriver Driver)// Метод ожидает окончания Ajax запроса на странице
        {
            int i = 0;
            while (TimeOutLoadAjax > (i = i + stepTime))
            {
                var ajaxIsComplete = (bool)(Driver as IJavaScriptExecutor).ExecuteScript("return jQuery.active == 0");
                if (ajaxIsComplete)
                {
                    Logs(" Ajax завершился");
                    break;
                }
                else if (TimeOutLoadAjax <= i)
                {
                    WebDriverScreenshot(Driver, DateTime.Now.ToString("\n dd-MMMM-yyyy HH-mm-ss") + "\n Ajax лимит времени (" + TimeOutLoadAjax / 1000 + " сек.) ожидания Ajax закончился");
                    break;
                }
                Thread.Sleep(stepTime);
            }
        }



#130780 Нестабильное прохождение тестов.

Отправлено автор: fenixx 27 мая 2014 - 07:12 в Selenium - Functional Testing

У меня легкий когнитивный диссонанс: jQuery.active==true => ajaxIsComplete - это как?

Url: jquery.com
Browser: FF24.0



>>> jQuery.active
0
>>> jQuery.active==true
false
>>> jQuery.active==0
true
>>> 0==true
false
>>> 1==true
true
>>> 2==true
false

 

Извините, ошибся, и поэтому выше сообщение исправил.




#130777 Нестабильное прохождение тестов.

Отправлено автор: fenixx 27 мая 2014 - 06:48 в Selenium - Functional Testing

Столкнулся с проблемой в ожидании завершения всех Ajax в FireFoxe вместо при проверке jQuery.active всегда выдает ждал и минуту и больше, подскажите как можно определить что за Ajax отрабатывает?

Визуально все Ajax-ы отработали.

public void WaitForAjax(IWebDriver Driver)// Метод ожидает окончания Ajax запроса на странице
        {
            int i = 0;
            while (TimeOutLoadAjax > (i = i + stepTime))
            {
                var ajaxIsComplete = (bool)(Driver as IJavaScriptExecutor).ExecuteScript("return jQuery.active == 0");
                if (ajaxIsComplete)
                {
                    Logs(" Ajax завершился");
                    break;
                }
                else if (TimeOutLoadAjax <= i)
                {
                    WebDriverScreenshot(Driver, DateTime.Now.ToString("\n dd-MMMM-yyyy HH-mm-ss") + "\n Ajax лимит времени (" + TimeOutLoadAjax / 1000 + " сек.) ожидания Ajax закончился");
                    break;
                }
                Thread.Sleep(stepTime);
            }
        }



#130438 Selenium FindElements Поиск элемента в элементе

Отправлено автор: fenixx 15 мая 2014 - 08:15 в Selenium - Functional Testing

Отрабатывает одинаково и ошибки выдает правильно. "./*//*[contains(@class,'control-label')]" - нет такого элемента, и findElements выдает size==0, а findElement эксепшен.
Еще раз: если вы используете findElement[s] и xpath в контексте WebElement, то:
1. Если xpath начинается с "./" - поисковым контентом будет являться искомый WebElement
2. Если xpath начинается с "/" - поисковым контентом будет являться root документа.

 

Большое спасибо за разъяснение!!!

var AllControls = D.FindElementsByXPath(@"//*[@id='PortfolioEditFormtab1']//*[contains(@class,'control-label')]/.."); 
string Selector = @"//*[contains(@class,'control-label')]");
var sel222 = AllControls[0].FindElement(By.XPath(@"." + Selector);//Так все работает верно )))Огромное спасибо!!!



#130432 Selenium FindElements Поиск элемента в элементе

Отправлено автор: fenixx 15 мая 2014 - 06:50 в Selenium - Functional Testing

Повезло! =работает правильно. В плане механики между findElements и findElement разницы нету.
Если нашли разницу - давайте код и сорс, т. к. либо вы заблуждаетесь, либо это баг.

 

 

15-05-2014 9-40-44.png

string XPathActivityTab = @"//*[@id='PortfolioEditFormtab1']";
string XPathAllLabel = @"//*[contains(@class,'control-label')]";
string XPathParent = @"/..";

var AllControls = D.FindElementsByXPath(XPathActivityTab + XPathAllLabel + XPathParent);
var sel1 = AllControls[0].FindElement(By.XPath(@"//*[contains(@class,'control-label')]"));
var sel11 = AllControls[0].FindElements(By.XPath(@"//*[contains(@class,'control-label')]"));
var sel22 = AllControls[0].FindElements(By.XPath(@"./*//*[contains(@class,'control-label')]"));
var sel222 = AllControls[0].FindElement(By.XPath(@"/./*" + @"//*[contains(@class,'control-label')]"));// Если так то работает
var sel2 = AllControls[0].FindElement(By.XPath(@"./*" + @"//*[contains(@class,'control-label')]")); // Выдает ошибку

15-05-2014 10-22-02.png

var tabs = D.FindElementsByXPath(@"//*[@id='tabs']");
var sel1  = tabs[1].FindElement(By.XPath(@"//a"));
var sel2  = tabs[1].FindElement(By.XPath(@"./*//a"));
var sel11 = tabs[1].FindElements(By.XPath(@"//a"));
var sel22 = tabs[1].FindElements(By.XPath(@"./*//a")); // Отрабатывает без ошибки 

Страница HTML

Прикрепленный файл  Test.7z   273,72К   2 Количество загрузок:

 

Почему отрабатывает по разному, и как с этим быть?




#130431 Selenium FindElements Поиск элемента в элементе

Отправлено автор: fenixx 15 мая 2014 - 06:24 в Selenium - Functional Testing

Повезло! =работает правильно. В плане механики между findElements и findElement разницы нету.
Если нашли разницу - давайте код и сорс, т. к. либо вы заблуждаетесь, либо это баг.




#130415 Selenium FindElements Поиск элемента в элементе

Отправлено автор: fenixx 14 мая 2014 - 14:24 в Selenium - Functional Testing

http://www.w3.org/TR/xpath/#node-tests
 

// is short for /descendant-or-self::node()/. For example, //para is short for /descendant-or-self::node()/child::para and so will select any para element in the document (even a para element that is a document element will be selected by //para since the document element node is a child of the root node); div//para is short for div/descendant-or-self::node()/child::para and so will select all para descendants of div children.


A location step of . is short for self::node(). This is particularly useful in conjunction with //. For example, the location path .//para is short for
self::node()/descendant-or-self::node()/child::para

and so will select all para descendant elements of the context node.

Или на примерах

//para selects all the para descendants of the document root and thus selects all para elements in the same document as the context node
.//para selects the para element descendants of the context node

 

 

 

Почему тогда это работает правильно Driver.FindElementsByXPath(@"//div")[1].FindElement(By.XPath(@"//a"))?

 

На сколько понимаю, FindElements если применяется к указанному элементу, то и поиск в указанном элементе должен проходить.

 

Получается что в Seleniume для FindElement и FindElements - нужно использовать разное написание XPath селекторов при поиске внутри элемента, т.к. этот вариант работать уже не будет Driver.FindElementsByXPath(@"//div")[1].FindElement(By.XPath(@"./*//a"))

 

Не понимаю почему в FindElement и FindElements работает по разному?

 

Где это может пригодиться при использовании?




#130411 Selenium FindElements Поиск элемента в элементе

Отправлено автор: fenixx 14 мая 2014 - 13:30 в Selenium - Functional Testing

Selenium v.2.41.0.0

Драйвер использую FirefoxDriver

Поиск элемента по XPath в элементе по XPath.

Пример:

// Получаю коллекцию
var tabs = D.FindElementsByXPath(XPathTabs); - работает

// Обращаюсь ко второму элементу в коллекции, и ищу внутри его все теги "а" через By.XPath
var tab3 = tabs[1].FindElements(By.XPath(@"//a")); // НЕ работает как надо. Возвращает коллекцию всех ссылок на странице

// Обращаюсь ко второму элементу в коллекции, и ищу внутри его все теги "а" через By.TagName.
var tab2 = tabs[1].FindElements(By.TagName("a")); // работает как надо. Возвращает коллекцию тегов "а" внутри "tabs[1]"

// Обращаюсь ко второму элементу в коллекции, и ищу внутри его все теги "а" через By.XPath
var tab3 = tabs[1].FindElements(By.XPath(@"./*" + "//a")); // работает как надо. Возвращает коллекцию тегов "а" внутри "tabs[1]"

Не понимаю почему при таком XPath-е:

XPath проверяю в FireFoxe через расширение FirePath

./*//a - возвращает коллекцию внутри элемента. - ничего не находит при проверке через FirePath

//a - А при таком ищет на всей странице

 

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




#129785 WebDriver Ошибочный клик по элементу

Отправлено автор: fenixx 18 апреля 2014 - 09:32 в Selenium - Functional Testing

В ФФ нативные отключаются так:

firefoxProfile.setEnableNativeEvents(false);
// или
firefoxCapabilities.setCapability("nativeEvents", false);

В Хроме их нет. А в ИЕ они есть, и включены по умолчанию.

Поэтому, я немного не понимаю, почему оно у вас так по разному работает везде, т.к. вы сами написали что в ИЕ всё работает корректно.

 

Спасибо.
Самому интересно почему по разному работает.

У меня в цикле прогоняется одно и тоже действие по страницам списка.

И что самое интересное, наведение на меню(onmouseover) отрабатывает только при первой итерации при последующих работает все как надо.




#129772 WebDriver Ошибочный клик по элементу

Отправлено автор: fenixx 18 апреля 2014 - 06:24 в Selenium - Functional Testing

Как вариант - выключите нативные ивенты nativeEvents

 

Спасибо за ссылку.

К сожалению английский плохо знаю, но на сколько понял событие это можно только отключить у браузера IE.

Но мне нужно отключить событие onmouseover для всех браузеров, в частности Chrom, FireFox, Safari, IE.

Кто может подсказать как это можно сделать через WebDriver или каким другим способом.




#129770 WebDriver Ошибочный клик по элементу

Отправлено автор: fenixx 18 апреля 2014 - 05:49 в Selenium - Functional Testing

 

 

У селениума "курсор мыши есть", но он "невидимый".
И он не двигается, перемещаясь с одного элемента страницы на другой.

Ой-ли?

html:
<html>
<head></head>
<body>
<div style='height:100px;width:100px;border-style:solid;border-width:1px' onmouseover='this.style.color="red"'>hello</div>
<input type='button' value='PushMe'/>
</body>
</html>
code:
		WebDriver driver = new FirefoxDriver();
		driver.get("file://///alex/temp/test1.html");
		System.out.println(driver.findElement(By.xpath("//div")).getAttribute("style"));
		driver.findElement(By.xpath("//input")).click();
		System.out.println(driver.findElement(By.xpath("//div")).getAttribute("style"));
		driver.quit();
output:
height: 100px; width: 100px; border-style: solid; border-width: 1px;
height: 100px; width: 100px; border-style: solid; border-width: 1px; color: red;

В момент клика "мышка" "появляется" на элементе - всё правильно.

Попробуйте другой тест:

1) квадрат, в левом верхнем углу кнопка, в центре большая кнопка размером почти с квадрат и в правом нижнем углу кнопка.

2) свойства у кнопок следующие:

- левая верхняя - просто для клика

- центральная большая с жаваскриптом, изменяющим цвет при действии onmouseover

- правая нижняя - просто для клика

3) выполните вебдрайвером клик по левой верхней кнопке потом клик по правой нижней кнопке.

 

Если вебдрайвер ведёт курсор мышки, центральная большая кнопка изменит цвет.

Но она не изменит его. Попробуйте.

 

 

Проверил, получается что vmaximv прав

Проверка:

<head></head>
<body>
<div style='height:100px;width:100px;border-style:solid;border-width:1px' onmouseover='this.style.color="red"'>hello
<input id="b2" type='button' value='PushMe'/>
</div>
<input id="b1" type='button' value='B1111111111111111111111'/>
</body>
</html>
            D.Navigate().GoToUrl(@"file:///D:/1.html");
            var b1 = D.FindElementById("b1");
            D.FindElementById("b1").Click();// тут ставил брекпоинт. После клика по input id="b1" у div появлялась красная рамка.
            var b2 = D.FindElementById("b2");
            D.FindElementById("b2").Click();

Подскажите можно ли отключить при работе с кликами срабатывания события "onmouseover", в моем случае это событие вообще ненужно в некоторых тестах




#129745 WebDriver Ошибочный клик по элементу

Отправлено автор: fenixx 17 апреля 2014 - 14:06 в Selenium - Functional Testing

Вам уже ответили.

Используйте actions.moveToElement ... 
Сначала подведите к элементу что ниже, а затем подведите и кликните на нужном, может прокатит...

А так как мы не видим лэйаут вашей страницы, общий совет такой - используйте Actions и лавируйте мышкой, что бы избежать попадания на drop_down_menu.
А еще лучше выпишите баг на юзабилити - подобные меню, без дэлея на экспанд жутко бесят не только WD, но и пользователей.

 

 

Спасибо.




#129744 WebDriver Ошибочный клик по элементу

Отправлено автор: fenixx 17 апреля 2014 - 13:59 в Selenium - Functional Testing

Используйте actions.moveToElement ... 

Сначала подведите к элементу что ниже, а затем подведите и кликните на нужном, может прокатит...

 

Спасибо за совет буду пробовать




#129737 WebDriver Ошибочный клик по элементу

Отправлено автор: fenixx 17 апреля 2014 - 13:10 в Selenium - Functional Testing

 

У селениума "курсор мыши есть", но он "невидимый".
И он не двигается, перемещаясь с одного элемента страницы на другой.

Ой-ли?

html:

<html>
<head></head>
<body>
<div style='height:100px;width:100px;border-style:solid;border-width:1px' onmouseover='this.style.color="red"'>hello</div>
<input type='button' value='PushMe'/>
</body>
</html>
code:

		WebDriver driver = new FirefoxDriver();
		driver.get("file://///alex/temp/test1.html");
		System.out.println(driver.findElement(By.xpath("//div")).getAttribute("style"));
		driver.findElement(By.xpath("//input")).click();
		System.out.println(driver.findElement(By.xpath("//div")).getAttribute("style"));
		driver.quit();
output:

height: 100px; width: 100px; border-style: solid; border-width: 1px;
height: 100px; width: 100px; border-style: solid; border-width: 1px; color: red;

 

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




#129733 WebDriver Ошибочный клик по элементу

Отправлено автор: fenixx 17 апреля 2014 - 12:37 в Selenium - Functional Testing

Раз тут всплыло слово "селект", вопрос - вам надо выбрать какой-то элемент в селекте?

 

Речь идет не про "селект", а про "селектор XPath".

Элемент по которому производится клик, это ссылка.




#129726 WebDriver Ошибочный клик по элементу

Отправлено автор: fenixx 17 апреля 2014 - 11:58 в Selenium - Functional Testing

Попробуйте в режиме дебага поставить брейкпоинт на этой строчке и посмотреть свойства объекта D.FindElementByXPath(viewSelectBtn). Тот ли это элемент, который Вы ожидаете?

 

Проверял, находит правильный элемент.

Еще предложения какие есть?




#129725 WebDriver Ошибочный клик по элементу

Отправлено автор: fenixx 17 апреля 2014 - 11:57 в Selenium - Functional Testing

Как вы проверяете на уникальность селектор?

 

XPath проверяю в FireFox через FirePath




#129719 WebDriver Ошибочный клик по элементу

Отправлено автор: fenixx 17 апреля 2014 - 11:13 в Selenium - Functional Testing

У селениума "курсор мыши есть", но он "невидимый".

И он не двигается, перемещаясь с одного элемента страницы на другой.

Представьте, что экран - двумерная картинка, а курсор селениума - это Ваш палец. Для того чтобы кликнуть на элементе, Вы просто кликаете, а не ведёте пальцем по экрану до нужного элемента.

"Движение" можно заметить только при DRAG&DROP.

 

Так что, если селениум кликает на элементе выпадающего меню, значит этот элемент удовлетворяет условиям поиска ХРАТН.

 

P.S. А что за язык-то?

 

Спасибо что объяснили как работает клик в Seleniume, очень подробно и понятно.

Язык - C#

viewSelectBtn - переменная типа string в ней селектор XPath

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

"Так что, если селениум кликает на элементе выпадающего меню, значит этот элемент удовлетворяет условиям поиска ХРАТН." - по селектору XPATH на странице находится единственный элемент. Кликает в областе найденного элемента, но не по найденному элементу. И непонятно почему выпадает меню во время клика.

Подскажите каким образом с этим разобраться?

Как можно перед кликом, получить координаты клика?




#129713 WebDriver Ошибочный клик по элементу

Отправлено автор: fenixx 17 апреля 2014 - 10:47 в Selenium - Functional Testing

Язык C#, Selenium, WebDriver

Подскажите, кто сталкивался с проблемой ошибочного клика по элементу. Замечено в FireFox и Chrom, в IE как не странно работает правильно ))
Если да то как решили это?

D.FindElementByXPath(viewSelectBtn).Click();

Клик происходит не по найденному элементу, а по элементу из выпадающего меню.
Такое ощущение, что курсор мыши проходит по всплывающему меню, в этот момент происходит перекрытие найденного элемента элементом из всплывающего меню и клик происходим на элементе меню.

Как быть?
Можно ли задать чтобы курсор мыши передвигался снизу?
Курсора мыши не видно, вообще каким образом реализованы в Selenium клики по элементу, подскажите кто знает?

 

P.s. Но что удивительно, если с начало кликнуть по другому элементу на странице, то следом за этим клик по 

D.FindElementByXPath(viewSelectBtn).Click();

проходит успешно.




#129618 Авторизация на портале Windows Form

Отправлено автор: fenixx 16 апреля 2014 - 07:26 в Selenium - Functional Testing

Посмотрите вот здесь примеры работы с FiddlerCore -- http://jimevansmusic.blogspot.ru/

 

Большое спасибо, буду разбираться.

 

Кстати если кому интересно временно решил проблему для браузеров Chrom, FireFox, Safari, под IE не работает т.к. там окно авторизации отличается от всех остальных.

Под другими браузерами не пробовал.

        void StartDriver(string MetodName)
        {
            FileLogs = DateTime.Now.ToString("dd-MM-yyyy HH-mm-ss ") + MetodName + ".txt";// Название файла. Название файла состоит из даты, времени запуска теста и названия тестового метода

            D = new ChromeDriver();

            D.Manage().Window.Maximize();// Разворачиваем браузер на весь экран
            SomeDelegate AsincAuth = AsincAuthenticate;
            AsincAuth.BeginInvoke("login", "pass", null, null);// Запускаю асинхронную функцию
            D.Navigate().GoToUrl(baseURL);// Переходим на главную страницу портала

            var BrowserName = D.Capabilities.BrowserName.ToString();
            Logs(" Браузер: " + BrowserName + " v." + D.Capabilities.Version.ToString());
        }
        delegate void SomeDelegate(string log, string pass);
        public void AsincAuthenticate(string log, string pass)
        {
            Thread.Sleep(3000);// Ставим задержку для появления окна авторизации
            SendKeys.SendWait(log);
            SendKeys.SendWait("{TAB}");
            SendKeys.SendWait(pass);
            SendKeys.SendWait("{ENTER}");
        }



#129377 Авторизация на портале Windows Form

Отправлено автор: fenixx 10 апреля 2014 - 14:01 в Selenium - Functional Testing

Кто уже использовал FiddlerCore или другой прокси для авторизации Selenium WebDriver, покажите пример кода авторизации на C# через прокси.

 

http://www.adathedev...ance-stats.html - Нашел статью как запустить прокси BrowserMob в Selenum WebDriver на C#, но не могу разобраться каким образом залогиниться через прокси.

 

https://github.com/A...ster.BrowserMob - тут исходник на C# для работы с прокси BrowserMob, взята из статьи указанной выше.

 

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

Помогите пожалуйста




#129376 Авторизация на портале Windows Form

Отправлено автор: fenixx 10 апреля 2014 - 13:57 в Selenium - Functional Testing

Те, кто пишет на C#, вместо BMP могут использовать FiddlerCore.

 

Спасибо.




#129319 Нестабильное прохождение тестов.

Отправлено автор: fenixx 09 апреля 2014 - 11:55 в Selenium - Functional Testing

Хорошо, тогда конкретный вопрос. Какими методами правильно и эфективно дождаться полной загрузки страницы после нажатия на кнопку или линку, кроме как вручную подбирать время задержки??

 

Тут как ожидать элемент лучше:

http://software-test...resent/?p=61704

 

Тут почему Wait класс не стоит использовать для ожидания:

http://software-test...resent/?p=61742

 

Возможно у вас на странице еще и Ajax загружается.
Загрузка страницы не означает окончание работы Ajax.

	int TimeOutLoadAjax = 30000; // 1000 = 1 сек.  
        int stepTime = 200; // Шаг ожидания
	public void WaitForAjax(IWebDriver Driver)// Метод ожидает окончания Ajax запроса на странице
        {
            int i = 0;
            while (TimeOutLoadAjax > (i = i + stepTime))
            {
                var ajaxIsComplete = (bool)(Driver as IJavaScriptExecutor).ExecuteScript("return jQuery.active == 0");// Это для ожидания завершения Ajax при использовании библиокеки jQuery
                if (ajaxIsComplete)
                {
                    // Тут логирование в случае окончания всех Ajax запросов на странице
                    break;
                }
                else if (TimeOutLoadAjax <= i)
                {
                    // Тут логирование в случае не удачи по окончанию времени
                }
                Thread.Sleep(stepTime);
            }
        }



#129294 Авторизация на портале Windows Form

Отправлено автор: fenixx 09 апреля 2014 - 06:06 в Selenium - Functional Testing

BrowserMobProxy
по-другому никак
Selenium WebDriver не работает с модальными окнами. В частности, аутентификацию силами только WebDriver сделать невозможно.

 

BrowserMobProxy написан на Java, я же пишу на C#, как быть в таком случае?




#129290 Авторизация на портале Windows Form

Отправлено автор: fenixx 09 апреля 2014 - 05:16 в Selenium - Functional Testing

BrowserMobProxy
по-другому никак
Selenium WebDriver не работает с модальными окнами. В частности, аутентификацию силами только WebDriver сделать невозможно.

 

Спасибо.

Буду изучать.