Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

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

Купить рекламу на форуме - 42 тыс руб за месяц

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

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

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

Последний раз редактировалось Вадим Мошев; 17.06.2018 в 01:02.
OmegaBerkut вне форума Ответить с цитированием
Старый 16.06.2018, 23:53   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Ну дык гуглите дальше про 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");
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

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

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

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

Последний раз редактировалось OmegaBerkut; 17.06.2018 в 01:48.
OmegaBerkut вне форума Ответить с цитированием
Старый 17.06.2018, 01:49   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

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

Ну или всегда можно выполнить любой JS.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 17.06.2018, 02:15   #5
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

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

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

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

Понагуглил всякие 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 в 17:49.
OmegaBerkut вне форума Ответить с цитированием
Старый 17.06.2018, 18:50   #7
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

В XPath можно использовать ' ' кавычки.
И если не нужно что-то сложное с наследниками/родителями или поиск текста, то проще CSS.
#someId
.some-class
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 17.06.2018, 18:55   #8
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

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


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


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