Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > .NET > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 17.06.2018, 00:29   #1
OmegaBerkut
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 906
Репутация: 111
По умолчанию ChromeDriver Selenium, ожидание выполнения скриптов

Здравствуйте.
Есть такая вот незадача ...
В браузере кнопка, по нажатии на которую весь основной экшн перехватывает на себя не то ли JavaScript, не то ли весь AJAX.
При посылке туда elem.Click() я сразу же получаю управление в коде, и дальнейшее выполнение сыпется.
Нагуглил всякие wait'ы, но как ими пользоваться в конкретном моём случае - я так и не понял =)
Ещё, до этого нагуглил
Код:

driver.Manage().Timeouts().AsynchronousJavaScript

, воткнул туда TimeSpan.MaxValue, эффекта ноль.

Как посоветуете быть ?
__________________
Подпись ? Не, не слышал ...

Последний раз редактировалось Вадим Мошев; 17.06.2018 в 02:02.
OmegaBerkut вне форума   Ответить с цитированием
Старый 17.06.2018, 00:53   #2
Alex11223
Модератор
Заслуженный модератор
 
Регистрация: 12.01.2011
Сообщений: 16,780
Репутация: 3300

icq: 512-765
skype: alexp.frl
По умолчанию

Ну дык гуглите дальше про wait'ы.

Я такую обертку использовал для удобства:
Код:

    public static class WaitHelper
    {
        public static TResult WaitUntil<TResult>(IWebDriver webDriver, TimeSpan timeout, Func<IWebDriver, TResult> condition, string message = "")
        {
            var wait = new WebDriverWait(webDriver, timeout);
            if (!String.IsNullOrEmpty(message))
                wait.Message = message;

            return wait.Until(condition);
        }

        public static TResult WaitUntil<TResult>(IWebDriver webDriver, int timeoutSec, Func<IWebDriver, TResult> condition, string message = "")
        {
            return WaitUntil(webDriver, TimeSpan.FromSeconds(timeoutSec), condition, message);
        }
    }

Код:

            WaitHelper.WaitUntil(webDriver, TimeSpan.FromSeconds(60), 
                ExpectedConditions.ElementExists(By.ClassName(".some-button")), 
                "Element not found");


Последний раз редактировалось Alex11223; 17.06.2018 в 01:06.
Alex11223 на форуме   Ответить с цитированием
Старый 17.06.2018, 02:41   #3
OmegaBerkut
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 906
Репутация: 111
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Я такую обертку использовал для удобства
Годно, благодарю ...
Помнится я тут как то создавал тему про то, как кликнуть в координаты ...
Создавать новую тему не хочу, а где старая - не нашёл.
Проблема в том, что я знаю где находится нужная мне кнопка по X и Y, но не знаю, как получить элемент; это список, опции которых скрыты, а в обёртку выгружаются они всё тем же JS/AJAX, и как по ним бахнуть я понятия не имею ...Пытался отправлять текстом в список - ничего хорошего из этого не вышло. Что по этому поводу сможете подсказать ?

Здесь уже начинает бушевать моя совесть, ибо я работаю над проектом, который приносит мне деньги, с кем делиться ? =)
__________________
Подпись ? Не, не слышал ...

Последний раз редактировалось OmegaBerkut; 17.06.2018 в 02:48.
OmegaBerkut вне форума   Ответить с цитированием
Старый 17.06.2018, 02:49   #4
Alex11223
Модератор
Заслуженный модератор
 
Регистрация: 12.01.2011
Сообщений: 16,780
Репутация: 3300

icq: 512-765
skype: alexp.frl
По умолчанию

Если там обычный <select>, то в Selenium.Support есть Select.

Ну или всегда можно выполнить любой JS.
Alex11223 на форуме   Ответить с цитированием
Старый 17.06.2018, 03:15   #5
OmegaBerkut
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 906
Репутация: 111
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Ну или всегда можно выполнить любой JS
Вот в JS я совсем не селен ...

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
в Selenium.Support есть Select
Да действительно, но у меня не работает ...
В списке элементов все тексты пустые, и на выбор элемента по индексу реакция нулевая.

В моём случае, похоже что нужно JS ... Но я не знаю что туды толкать.
Вложил скриншот куска DOM-а - "скрытые" элементы в программе видятся как пустые элементы с нулевыми размерами и позициями.
Изображения
Тип файла: png DOM.png (35.8 Кб, 28 просмотров)
__________________
Подпись ? Не, не слышал ...
OmegaBerkut вне форума   Ответить с цитированием
Старый 17.06.2018, 18:41   #6
OmegaBerkut
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 906
Репутация: 111
По умолчанию

Понагуглил всякие Actions, вот что накодил:
Код:

IWebElement current=driver.FindElementByXPath("//*[@id=\"select2-productsform-p1-container\"]"); // элемент списка на морде
current.Click(); // открыть список
Thread.Sleep(500); // дождаться пока откроется, ибо анимация, чтоб её
int
	xOffset=25, // взял с потолка, ширина компонента 650 пикселей
	yOffset=80; // в пэинте вымерял, можно настроить по вкусу (по условиям)

Actions clicker=new Actions(driver);
clicker.MoveToElement(current,xOffset,yOffset).Click().Build().Perform();

И сработало, но всё равно, что то мне подсказывает, что с этим у меня могут быть проблемы в дальнейшем (ну там при запуске на другом компьютере все дела).
Смещение в функции MoveToElement выполняется НЕ от центра элемента, как было написано в некоторых местах интернета, а от верхнего левого угла элемента, как это и положено в компьютерах (а это моё ИМХО =) ).

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

Последний раз редактировалось OmegaBerkut; 17.06.2018 в 18:49.
OmegaBerkut вне форума   Ответить с цитированием
Старый 17.06.2018, 19:50   #7
Alex11223
Модератор
Заслуженный модератор
 
Регистрация: 12.01.2011
Сообщений: 16,780
Репутация: 3300

icq: 512-765
skype: alexp.frl
По умолчанию

В XPath можно использовать ' ' кавычки.
И если не нужно что-то сложное с наследниками/родителями или поиск текста, то проще CSS.
#someId
.some-class
Alex11223 на форуме   Ответить с цитированием
Старый 17.06.2018, 19:55   #8
OmegaBerkut
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 906
Репутация: 111
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
проще CSS
Как то парсил сайт avto.pro, и там каждый раз приходили разные данные в CSS селекторах. Почему - не знаю.
Знаю только то, что XPath в этом плане будет более универсален и устойчив. Даже по Id и ClassName не всегда могут находиться элементы.
__________________
Подпись ? Не, не слышал ...
OmegaBerkut вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Selenium, chromedriver.exe падает "просто потому что" OmegaBerkut Общие вопросы по программированию, компьютерным наукам 10 09.04.2018 22:28
Selenium, ChromeDriver OmegaBerkut C# (си шарп) 12 07.02.2017 12:24
библиотека скриптов с VM с поддержкой шага выполнения Пепел Феникса Общие вопросы по программированию, компьютерным наукам 3 01.03.2016 16:39
Ожидание выполнения TerminateProcess Shouldercannon Win Api 7 13.07.2012 17:37
Ожидание выполнения файла .cmd Droid Общие вопросы Delphi 14 01.08.2010 17:05


20:21.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru