Объясните пожалуйста про WebDriverRunner.setWebDriver();

335 views
Skip to first unread message

Аinur Salavatullin

unread,
Oct 12, 2016, 3:57:40 PM10/12/16
to selenide-ru
Здравствуйте!
Прочитал тут что можно запустить свой кастомный webDriver.
Стало ну очень интересно, так как были тесты когда то написанные с помощью SmartClientWebDriver.
Если я правильно понимаю SmartClientWebDriver это "обертка" над webDriver'ом Selenium.
А вопрос мой вот в чем, можно ли сделать что-то наподобие вот такого:

protected static SmartClientWebDriver smartClientWebDriver;

...

WebDriverRunner.setWebDriver(smartClientWebDriver);

...



Если да, то как вызывать методы этого, кастомного веб-драйвера?
Ну т.е. методы "стандартного" Селениумовского веб-драйвера можно вызывать вот так:

getWebDriver().findElement(By.xpath(""));

А как вызывать методы SmartClientWebDriver? 

P.S. На самом деле потребность SmartClientWebDriver возникла из-за того, что у него есть удобный (ну честно) метод waitForGridDone:

smartClientWebDriver.waitForGridDone(ByScLocator.scLocator(""));


Этот веб-драйвер мне и не нужен, если подскажите как это можно провернуть с Selenide.
Пробовал так:

$(scLocator(gridSC())).waitUntil(Condition.enabled, 5000);

или Condition.exist (.appear и т.д.) но никак не получается именно дождаться загрузки грида (тесты не ждут, а бегут дальше)...

Andrei Solntsev

unread,
Oct 12, 2016, 4:21:25 PM10/12/16
to Аinur Salavatullin, selenide-ru
Привет!
Использовать методы SmartClientWebDriver очень просто. Надо его просто закастить:

((SmartClientWebDriver) getWebDriver()).waitForGridDone(ByScLocator.scLocator(""));

Но ведь можно проще! Ведь вы сами создаёте инстанс SmartClientWebDriver, и как я понял, храните его в своей статической переменной. Почему бы её и не использовать?

P.S. А чего такого полезного делает этот waitForGridDone, я пока не понял. Что такое этот грид и почему так важно его подождать? Почему недостаточно дождаться видимости элемента?

P.S. Кстати, такая же потребность возникает, например, при работе с Appium. У AppiumDriver тоже есть масса полезных методов. 

Andrei Solntsev

12 октября 2016 г., 22:57 пользователь Аinur Salavatullin <ai...@binadox.com> написал:

--
Вы получили это сообщение, поскольку подписаны на группу "selenide-ru".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес selenide-ru+unsubscribe@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

Аinur Salavatullin

unread,
Oct 12, 2016, 4:49:46 PM10/12/16
to Andrei Solntsev, selenide-ru
1. > ((SmartClientWebDriver) getWebDriver()).waitForGridDone(ByScLocator.scLocator(""));
Точно :)

2. > Но ведь можно проще! Ведь вы сами создаёте инстанс SmartClientWebDriver, и как я понял, храните его в своей статической переменной. Почему бы её и не использовать?
А тут я не понял.

До использования Selenide, у меня запуск браузера осуществлялся так:

protected static SmartClientWebDriver smartClientWebDriver;
...
DesiredCapabilities capability = new DesiredCapabilities();
capability.setCapability("platform", "ANY");
capability.setCapability("browserName", "chrome");
capability.setCapability("version", "");
smartClientWebDriver = new SmartClientRemoteWebDriver(new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"),capability));
smartClientWebDriver .navigate().to(baseUrl); 
... 

Тесты на другом проекте я писал уже только на Selenide, и запуск настраивал так:

String hub = "http://localhost:4444/wd/hub";
Configuration.remote = hub;
Configuration.browser = "chrome";
open(baseUrl);

А как теперь мне переписать со SmartClientWebDriver? Типа вот так:

protected static SmartClientWebDriver smartClientWebDriver;
...
DesiredCapabilities capability = new DesiredCapabilities();
capability.setCapability("platform""ANY");
capability.setCapability("browserName""chrome");
capability.setCapability("version""");
smartClientWebDriver new SmartClientRemoteWebDriver(new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"),capability));
WebDriverRunner.setWebDriver(smartClientWebDriver);
open(baseUrl); 
... 
smartClientWebDriver.waitForGridDone() 
 

???

А не запуститься ли так два браузера?

3. Grid это gwt'шная таблица.
http://www.gwt-ext.com/demo/#basicArrayGrid

Можно подождать и видимости элемента. А если таблица будет пуста? :)
Имеете ввиду, что то типа:

$(scLocator(gridSC())).waitUntil(Condition.visible, 5000);

??


--
Ainur Salavatullin,
QA, Binadox

Аinur Salavatullin

unread,
Oct 12, 2016, 5:12:48 PM10/12/16
to selenide-ru, andrei....@gmail.com
Попробовал кастануть:

((SmartClientWebDriver) getWebDriver()).waitForGridDone(scLocator(gridSC));


получил негатив от IDEA:

java.lang.ClassCastException: org.openqa.selenium.remote.RemoteWebDriver cannot be cast to com.isomorphic.webdriver.SmartClientWebDriver

Andrei Solntsev

unread,
Oct 13, 2016, 12:55:03 AM10/13/16
to Аinur Salavatullin, selenide-ru
Значит, ты всё-таки не сеттишь свой SmartClientWebDriver в нужном месте. 
Selenide использует не SmartClientWebDriver, а какой-то RemoteWebDriver.

Andrei Solntsev

13 октября 2016 г., 0:12 пользователь Аinur Salavatullin <ai...@binadox.com> написал:

Аinur Salavatullin

unread,
Oct 14, 2016, 4:42:29 AM10/14/16
to Andrei Solntsev, selenide-ru
Я так понял у меня из-за иерархии это не получалось (см. 14-10-2016 11-02-09.png). 
Наверное не было бы проблем, если SmartClientWebDriver (а точнее SmartClientRemoteWebDriver) был бы под RemoteWebDriver.
А getWebDriver() возвращает RemoteWebDriver... (я запускаю тесты через selenium grid).
Решили проблему создав класс wrapper, которая является наследником RemoteWebDriver.
И все хорошо :)

14-10-2016 11-02-09.png

Аinur Salavatullin

unread,
Oct 14, 2016, 5:53:26 AM10/14/16
to Andrei Solntsev, selenide-ru
Или вообще вот так:

new SmartClientRemoteWebDriver((RemoteWebDriver) getWebDriver()).waitForGridDone(ByScLocator.scLocator(gridSC));
вместо

((SmartClientRemoteWebDriver) getWebDriver()).waitForGridDone(scLocator(gridSC()));



Reply all
Reply to author
Forward
0 new messages