Почему преобразование в Webdriver выполняется вместо RemoteWebdriver при работе с любым драйвером браузера в Selenium? - PullRequest
0 голосов
/ 21 сентября 2018

RemoteWebdriver реализует интерфейс Webdriver, тогда почему бы нам не преобразовать RemoteWebdriver вместо Webdriver при создании объекта любого драйвера браузера?

1 Ответ

0 голосов
/ 21 сентября 2018

По определению апкастинг

переменная класса Parent ссылается на объект класса Child

Другими словами, если class A является родителем, то class B extends A это ребенок.Upcasting будет:

B b = new B();
A a = b; // upcasting

Но отношения между RemoteWebDriver и WebDriver не являются родителями / потомками:

RemoteWebDriver implements WebDriver

Следовательно, здесь нет никакого upcast.И вопрос в другом:

почему бы нам не объявить конкретный тип RemoteWebDriver вместо WebDriver при создании объекта любого драйвера браузера

причины те же, что и при ответе на более общий вопрос: Почему предпочтителен интерфейс для класса Java? .И действительно: если бы разработчики Selenium удалили / устарели RemoteWebDriver, вы бы хотели изменить свои тесты?

Кстати: вот случай фактического обновления до RemoteWebDriver:

ChromeDriver driver = new ChromeDriver(); // ChromeDriver extends RemoteWebDriver
RemoteWebDriver remoteDriver = driver;

Также верно следующее, хотя трудно найти причину, по которой вы хотите это сделать:

WebDriver driver = new ChromeDriver();
RemoteWebDriver remoteDriver = (RemoteWebDriver) driver;

Один из случаев использования, который я видел, это когда люди хотят использовать какой-то другой интерфейс, реализованныйRemoteWebDriver (т.е. не WebDriver, а, скажем, TakesScreenshot).Но тогда лучше привести к этому интерфейсу напрямую:

WebDriver driver = new ChromeDriver();
TakesScreenshot ts = (TakesScreenshot) driver;
ts.getScreenshotAs(...);
...