В данном уроке речь пойдет о следующих темах:
- Пример создания интерфейса Java
- Перегрузка метода интерфейса
- Использование типа интерфейса
- Down Casting (приведение к типу)
Как и раньше, нам понадобится основной проект и его классы:
Интерфейс Page имеет следующий код:
1 2 3 4 5 6 7 8 |
package interfaceandinheritance; public interface Page { // interface method without method body GoogleSearchResultPage search(String testData); } |
Класс GoogleHomePage:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
package interfaceandinheritance; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import java.util.ArrayList; import java.util.List; public class GoogleHomePage implements Page { // Using interface WebDriver and not a specific implementation private WebDriver webDriver; private By searchBox = By.name("q"); private By searchButton = By.name("btnG"); public GoogleHomePage(final WebDriver webDriver) { this.webDriver = webDriver; } /** * search on google home page. * * @param testData * * @return page object of GoogleSearchResultPage */ @Override public GoogleSearchResultPage search(final String testData) { System.out.println("##################################"); System.out.println("##################################"); System.out.println("Search on google home page, search data: " + testData); webDriver.findElement(searchBox).clear(); // steps can be run on any implementation of WebDriver. i.e. - FF, // Chrome, IE etc webDriver.findElement(searchBox).sendKeys(testData); webDriver.findElement(searchButton).click(); return new GoogleSearchResultPage(webDriver); // return page object of search result page } /** * @return link name of all links on google home page */ public List<String> getGoogleHomePageLinkText() { List<String> linkTexts = new ArrayList<String>(); List<WebElement> linkElements = webDriver.findElements(By.tagName("a")); // findElements method to get // collection of WebElement for (WebElement element : linkElements) { String linkText = element.getText(); linkTexts.add(linkText); } return linkTexts; } } |
Класс GoogleSearchResultPage:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
package interfaceandinheritance; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import java.util.ArrayList; import java.util.List; public class GoogleSearchResultPage implements Page { // Using interface WebDriver and not a specific implementation private WebDriver webDriver; private By searchBox = By.name("q"); private By searchButton = By.cssSelector("button[name='btnG']"); private By resultStats = By.id("resultStats"); public GoogleSearchResultPage(final WebDriver webDriver) { this.webDriver = webDriver; } /** * @param testData * * @return GoogleSearchResultPage instance */ @Override public GoogleSearchResultPage search(final String testData) { System.out.println("##################################"); System.out.println("##################################"); System.out.println("Search on google search result page, search data: " + testData); webDriver.findElement(searchBox).clear(); webDriver.findElement(searchBox).sendKeys(testData); webDriver.findElement(searchButton).click(); return this; } // method specific to GoogleSearchResultPage public String getResultSet() { return webDriver.findElement(resultStats).getText(); } /** * @return link name of all links on google search result page */ public List<String> getGoogleSearchResultPageLinkText() { List<String> linkTexts = new ArrayList<String>(); List<WebElement> linkElements = webDriver.findElements(By.tagName("a")); for (WebElement element : linkElements) { String linkText = element.getText(); linkTexts.add(linkText); } return linkTexts; } } |
И тестовый класс TestClass:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
package testclasses.interfaceandinheritance; import interfaceandinheritance.Browser; import interfaceandinheritance.GoogleHomePage; import interfaceandinheritance.GoogleSearchResultPage; import interfaceandinheritance.Page; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.ie.InternetExplorerDriver; import java.util.concurrent.TimeUnit; public class TestClass { private WebDriver webDriver; /** * initialize driver. * * @param browser */ public void initDriver(final Browser browser) { switch (browser) { case Chrome : // assign object to type interface and not specific implementation webDriver = new ChromeDriver(); break; case FF : webDriver = new FirefoxDriver(); break; case IE : webDriver = new InternetExplorerDriver(); break; default : System.out.println("Invalid Browser!!!"); } webDriver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); } /** * launch web application. */ public void launchApp() { webDriver.get("http://www.google.com/"); } /** * shut down driver. */ public void shutDownDriver() { webDriver.close(); webDriver.quit(); } public void searchOnGoogleHomePage(final String testData) { // invalid, an interface can not be instantiated since it is incomplete // Page page = new Page(); // assign object to type interface and not specific implementation Page googleHomePage = new GoogleHomePage(webDriver); // search on home page googleHomePage.search(testData); } public void searchOnSearchResultPage(final String testData) { // search on search result page Page googleSearchResultPage = new GoogleSearchResultPage(webDriver); googleSearchResultPage.search(testData); } public String getSearchResultStatistics() { System.out.println("########################################"); System.out.println("########################################"); System.out.println("calling method specific to GoogleSearchResultPage"); Page page = new GoogleSearchResultPage(webDriver); String searchResultStatistics = null; // check if page is instance of GoogleSearchResultPage if (page instanceof GoogleSearchResultPage) { searchResultStatistics = ((GoogleSearchResultPage) (page)).getResultSet(); } return searchResultStatistics; } public static void main(final String[] args) { TestClass testClass = new TestClass(); Browser browser = Browser.FF; testClass.initDriver(browser); testClass.launchApp(); testClass.searchOnGoogleHomePage("black box testing"); testClass.searchOnSearchResultPage("white box testing"); System.out.println("Result set is: " + testClass.getSearchResultStatistics()); testClass.shutDownDriver(); } } |
Начну краткое объяснение кода…
Для объявления интерфейса Page используется ключевое слово interface. Он имеет один метод search типа GoogleSearchResultPage, который не имеет реализации, что и отличает его от простого класса или абстрактоного класса.
1 |
GoogleSearchResultPage search(String testData); |
Все классы, которые реализуют этот интерфейс, – должны обязательно выполнить метод search.
У нас два класса реализуют интерфейс – GoogleHomePage и GoogleSearchResultPage. Для этого используется ключевое слово implements.
1 |
public class GoogleHomePage implements Page |
К тому же, если класс реализует интерфейс, то он обязательно должен реализовать с перегрузкой и все объявленные в нем методы.
Оба класса перегружают метод search. Например,
1 2 3 4 5 6 7 8 9 10 11 12 |
@Override public GoogleSearchResultPage search(final String testData) { System.out.println("##################################"); System.out.println("##################################"); System.out.println("Search on google home page, search data: " + testData); webDriver.findElement(searchBox).clear(); // steps can be run on any implementation of WebDriver. i.e. - FF, // Chrome, IE etc webDriver.findElement(searchBox).sendKeys(testData); webDriver.findElement(searchButton).click(); return new GoogleSearchResultPage(webDriver); // return page object of search result page } |
Как можно увидеть, для перегрузки используется аннотация @Override.
Обратите внимание на интересную реализацию методов searchOnGoogleHomePage, searchOnSearchResultPage и getSearchResultStatistics. У всех них объявляется объект типа интерфейса Page, например,
1 |
Page googleHomePage = new GoogleHomePage(webDriver); |
Для его создания используется конструктор разных классов и основная цель этого объекта – это вызов перегруженных методов search.
Более интересной является запись:
1 2 3 |
if (page instanceof GoogleSearchResultPage) { searchResultStatistics = ((GoogleSearchResultPage) (page)).getResultSet(); } |
В скобках оператора if используется ключевое слово instanceof, которое проверяет, относиться ли объект page к типу GoogleSearchResultPage.
Если условие выполняется (true), то ранее созданной переменной типа String searchResultStatistics присваивается значение, возвращаемое методом getResultSet в классе GoogleSearchResultPage. Операция
1 |
((GoogleSearchResultPage) (page)) |
имеет название “downсasting” (приведение к типу). Это делается для того, чтобы четко определить, какие методы и какого класса использовать, так как у нас в наличии есть 2 класса – главный и наследник.