Selenium Уебдрайвер Java Примерна програма
Selenium Java Пример
Използване на Java клас „myclass“, който създадохме в предишния урок, нека се опитаме да създадем WebDriver скрипт, който би:
Стъпка 1: донасям Mercury Начална страница на Tours
Стъпка 2: проверете заглавието му
Стъпка 3: отпечатайте резултата от сравнението
Стъпка 4: затворете го, преди да приключите цялата програма.
Selenium Примерен код на WebDriver
По-долу е действителният код на WebDriver за логиката, представена от сценария по-горе
package newproject; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; //comment the above line and uncomment below line to use Chrome //import org.openqa.selenium.chrome.ChromeDriver; public class PG1 { public static void main(String[] args) { // declaration and instantiation of objects/variables System.setProperty("webdriver.gecko.driver","C:\\geckodriver.exe"); WebDriver driver = new FirefoxDriver(); //comment the above 2 lines and uncomment below 2 lines to use Chrome //System.setProperty("webdriver.chrome.driver","G:\\chromedriver.exe"); //WebDriver driver = new ChromeDriver(); String baseUrl = "https://demo.guru99.com/test/newtours/"; String expectedTitle = "Welcome: Mercury Tours"; String actualTitle = ""; // launch Fire fox and direct it to the Base URL driver.get(baseUrl); // get the actual value of the title actualTitle = driver.getTitle(); /* * compare the actual title of the page with the expected one and print * the result as "Passed" or "Failed" */ if (actualTitle.contentEquals(expectedTitle)){ System.out.println("Test Passed!"); } else { System.out.println("Test Failed"); } //close Fire fox driver.close(); } }
Забележка: Стартира се Firefox 35, трябва да използвате драйвер за gecko, създаден от Mozilla, за да използвате уеб драйвер. Selenium 3.0, gecko и firefox имат проблеми със съвместимостта и правилното им настройване може да се превърне в трудна задача. Ако кодът не работи, понижете до Firefox версия 47 или по-ниска. Като алтернатива можете да стартирате скриптовете си в Chrome. Selenium работи извън кутията за Chrome. Просто трябва да промените 3 реда код, за да накарате скрипта си да работи с Chrome или Firefox
Обяснение на кода
Импортиране на пакети
За да започнете, трябва да импортирате следните два пакета:
- org.openqa.selenium.*– съдържа класа WebDriver, необходим за създаване на нов браузър, зареден със специфичен драйвер
- org.openqa.selenium.firefox.Firefoxдрайвер – съдържа FirefoxКлас на драйвер, необходим за инстанциране на a Firefox-специфичен драйвер в браузъра, създаден от класа WebDriver
Ако вашият тест се нуждае от по-сложни действия като достъп до друг клас, правене на екранни снимки на браузъра или манипулиране на външни файлове, определено ще трябва да импортирате повече пакети.
Създаване на обекти и променливи
Обикновено това е начинът, по който се инстанцира обект на драйвер.
WebDriver driver = new FirefoxDriver();
A FirefoxКлас на драйвер без параметри означава, че по подразбиране Firefox профилът ще бъде стартиран от нашия Java програма. По подразбиране Firefox профилът е подобен на стартирането Firefox в безопасен режим (не се зареждат разширения).
За удобство запазихме основния URL адрес и очакваното заглавие като променливи.
Стартиране на сесия на браузър
WebDriver's получи () се използва за стартиране на нова сесия на браузъра и я насочва към URL адреса, който сте посочили като негов параметър.
driver.get(baseUrl);
Вземете действителното заглавие на страницата
Класът WebDriver има getTitle() метод, който винаги се използва за получаване на заглавието на текущо заредената страница.
actualTitle = driver.getTitle();
Сравнете очакваните и действителните стойности
Тази част от кода просто използва основен Java if-else структура за сравняване на действителното заглавие с очакваното.
if (actualTitle.contentEquals(expectedTitle)){ System.out.println("Test Passed!"); } else { System.out.println("Test Failed"); }
Прекратяване на сесия на браузъра
"близо()” се използва за затваряне на прозореца на браузъра.
driver.close();
Прекратяване на цялата програма
Ако използвате тази команда, без първо да затворите всички прозорци на браузъра, целият ви Java програмата ще приключи, докато прозорецът на браузъра остава отворен.
System.exit(0);
Изпълнение на теста
Има два начина за изпълнение на код Eclipse SDI.
- On Eclipseлентата с менюта на, щракнете Бягай > Бягай.
- Натискане Ctrl + F11 за да стартирате целия код.
Ако сте направили всичко правилно, Eclipse ще изведе „Тестът премина!“
Намиране на GUI елементи
Намирането на елементи в WebDriver се извършва с помощта на „findElement(По.локатор())” метод. Частта „локатор“ на кода е същата като всеки от локаторите, разгледани по-рано в Selenium IDE глави от тези уроци. Всъщност се препоръчва да намерите GUI елементи с помощта на IDE и след успешно идентифициране да експортирате кода в WebDriver.
Тук е Selenium примерен код, който намира елемент по неговия идентификатор. Facebook се използва като основен URL адрес.
package newproject; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; public class PG2 { public static void main(String[] args) { System.setProperty("webdriver.gecko.driver","C:\\geckodriver.exe"); WebDriver driver = new FirefoxDriver(); String baseUrl = "http://www.facebook.com"; String tagName = ""; driver.get(baseUrl); tagName = driver.findElement(By.id("email")).getTagName(); System.out.println(tagName); driver.close(); System.exit(0); } }
Използвахме getTagName() метод за извличане на името на етикета на този конкретен елемент, чийто идентификатор е „имейл“. Когато се изпълни, този код трябва да може правилно да идентифицира името на етикета „вход“ и да го отпечата Eclipseпрозорец на конзолата.
Резюме за локализиране на елементи
Вариация | Descriptйон | Проба |
---|---|---|
By.className | намира елементи въз основа на стойността на атрибута “class”. | findElement(By.className(“someClassName”)) |
Чрез.cssSelector | намира елементи въз основа на основния CSS Selector двигател на драйвера | findElement(By.cssSelector(“input#email”)) |
By.id | намира елементи по стойността на техния атрибут „id“. |
findElement(By.id(“someId”)) |
By.linkText | намира елемент на връзка по точния текст, който показва |
findElement(By.linkText(“РЕГИСТРАЦИЯ”)) |
По име | намира елементи по стойността на атрибута „име“. |
findElement(By.name(“someName”)) |
By.partialLinkText | намира елементи, които съдържат дадения текст на връзката |
findElement(By.partialLinkText(“REG”)) |
By.tagName | локализира елементите по техните имена на тагове |
findElement(By.tagName(“div”)) |
По.xpath | намира елементи чрез XPath |
findElement(By.xpath(“//html/body/div/table/tbody/tr/td[2]/table/ tbody/tr[4]/td/table/tbody/tr/td[2]/table/tbody/tr[2]/td[3]/ form/table/tbody/tr[5]”)) |
Забележка относно използването на findElement(By.cssSelector())
By.cssSelector()
не поддържа функцията „съдържа“. Помислете за Selenium IDE код по-долу –
In Selenium IDE по-горе, целият тест премина. Въпреки това в Selenium Скрипт на WebDriver по-долу, същият тест генерира грешка, тъй като WebDriver не поддържа ключовата дума „contains“, когато се използва в метода By.cssSelector().
Общи команди
Създаване на уеб елементи
Вместо да използвате дългия синтаксис „driver.findElement(By.locator())“ всеки път, когато имате достъп до конкретен елемент, можем да инстанциираме WebElement обект за него. Класът WebElement се съдържа в пакета „org.openqa.selenium.*“.
Щракване върху елемент
Щракването е може би най-често срещаният начин за взаимодействие с уеб елементи. The click()
методът се използва за симулиране на щракането на всеки елемент. Следното Selenium Java пример показва как click()
се използва за щракване върху Mercury Бутон „Вход“ на Tours.
Когато използвате метода click(), трябва да имате предвид следните неща.
- Не приема никакъв параметър/аргумент.
- Методът автоматично изчаква зареждане на нова страница, ако е приложимо.
- Елементът, върху който ще се кликне, трябва да е видим (височината и ширината не трябва да са равни на нула).
Вземете команди
Командите Get извличат различна важна информация за страницата/елемента. Ето някои важни команди за получаване, с които трябва да сте запознати.
Команди | употреба |
---|---|
получи ()
Примерна употреба: |
|
getTitle()
Примерна употреба: |
|
getPageSource()
Примерна употреба: |
|
getCurrentUrl()
Примерна употреба: |
|
getText()
Примерна употреба: |
|
Команди за навигация
Тези команди ви позволяват да опреснявате, влизате и превключвате напред и назад между различни уеб страници.
навигация().към()
Примерна употреба: |
|
navigate().refresh()
Примерна употреба: |
|
навигация().назад()
Примерна употреба: |
|
навигация().напред()
Примерна употреба: |
|
Затваряне и излизане от браузъра Windows
близо()
Примерна употреба: |
|
откажат от ()
Примерна употреба: |
|
За да се илюстрира ясно разликата между close()
намлява quit()
, опитайте да изпълните кода по-долу. Той използва уеб страница, която автоматично изскача прозорец при зареждане на страницата и отваря друг след излизане.
Забележете, че беше затворен само прозорецът на родителския браузър, а не двата изскачащи прозореца.
Но ако използвате quit(), всички прозорци ще бъдат затворени – не само родителският. Опитайте да стартирате кода по-долу и ще забележите, че двата изскачащи прозореца по-горе също ще бъдат затворени автоматично.
package newproject; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; public class PG3 { public static void main(String[] args) { System.setProperty("webdriver.gecko.driver","C:\\geckodriver.exe"); WebDriver driver = new FirefoxDriver(); driver.get("http://www.popuptest.com/popuptest2.html"); driver.quit(); // using QUIT all windows will close } }
Превключване между рамки
За да осъществим достъп до GUI елементи във Frame, първо трябва да насочим WebDriver да се фокусира върху рамката или изскачащия прозорец, преди да имаме достъп до елементи в тях. Да вземем например уеб страницата https://demo.guru99.com/selenium/deprecated.html
Тази страница има 3 рамки, чиито атрибути „име“ са посочени по-горе. Искаме да получим достъп до връзката „Отхвърлено“, оградена по-горе в жълто. За да направим това, първо трябва да инструктираме WebDriver да превключи към рамката „classFrame“, използвайки „switchTo().frame()“ метод. Ще използваме атрибута name на рамката като параметър за частта „frame()“.
package newproject; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; public class PG4 { public static void main(String[] args) { System.setProperty("webdriver.gecko.driver","C:\\geckodriver.exe"); WebDriver driver = new FirefoxDriver(); driver.get("https://demo.guru99.com/selenium/deprecated.html"); driver.switchTo().frame("classFrame"); driver.findElement(By.linkText("Deprecated")).click(); driver.close(); } }
След като изпълните този код, ще видите, че рамката „classFrame“ е отведена на страницата „Отхвърлен API“, което означава, че нашият код успешно успя да получи достъп до връзката „Отхвърлен“.
Превключване между изскачащи прозорци Windows
WebDriver позволява показването на изскачащи прозорци като предупреждения, за разлика от Selenium IDE. За достъп до елементите в предупреждението (като съобщението, което съдържа), трябва да използваме "switchTo().alert()"
метод. В кода по-долу ще използваме този метод за достъп до полето за предупреждение и след това ще извлечем съобщението му с помощта на "getText()"
и след това автоматично затворете предупредителното поле с помощта на "switchTo().alert().accept()"
метод.
Първо се насочете към https://output.jsbin.com/usidix/1 и щракнете ръчно върху „Напред!“ бутон там и вижте сами текста на съобщението.
Да видим Selenium примерен код за това-
package mypackage; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; public class myclass { public static void main(String[] args) { System.setProperty("webdriver.gecko.driver","C:\\geckodriver.exe"); WebDriver driver = new FirefoxDriver(); String alertMessage = ""; driver.get("http://jsbin.com/usidix/1"); driver.findElement(By.cssSelector("input[value=\"Go!\"]")).click(); alertMessage = driver.switchTo().alert().getText(); driver.switchTo().alert().accept(); System.out.println(alertMessage); driver.quit(); } }
От Eclipse конзола, забележете, че отпечатаното предупредително съобщение е:
коледари
Има два вида чакане.
- Неявно изчакване – използва се за задаване на времето за изчакване по подразбиране в цялата програма
- Изрично изчакване – използва се за задаване на времето за изчакване само за конкретен случай
Неявно изчакайте
- По-лесно е да се кодира от Explicit Waits.
- Обикновено се декларира в инстанциращата част на кода.
- Ще ви трябва само един допълнителен пакет за импортиране.
За да започнете да използвате имплицитно изчакване, ще трябва да импортирате този пакет във вашия код.
След това в частта за инстанциране на вашия код добавете това.
Изрично изчакайте
Изричните изчаквания се извършват с помощта на класовете WebDriverWait и ExpectedCondition. За следното Selenium Пример за WebDriver, ще изчакаме до 10 секунди, за да стане видим елемент, чийто идентификатор е „потребителско име“, преди да продължим към следващата команда. Ето стъпките.
Стъпка 1:
Импортирайте тези два пакета:
Стъпка 2:
Декларирайте променлива WebDriverWait. В този пример ще използваме „myWaitVar“ като име на променливата.
Стъпка 3:
Използвайте myWaitVar с ExpectedConditions на части, където трябва да се появи изрично изчакване. В този случай ще използваме изрично изчакване на „потребителското име“ (Mercury Tours HomePage) въвеждане, преди да напишем текста „урок“ върху него.
Условия
Следните методи се използват при условни и циклични операции —
- isEnabled() се използва, когато искате да проверите дали даден елемент е активиран или не, преди да изпълните команда.
- isDisplayed() се използва, когато искате да проверите дали определен елемент се показва или не, преди да изпълните команда.
- е избрано () се използва, когато искате да проверите дали определен квадратче за отметка, бутон за избор или опция в падащо поле е избрано. Не работи върху други елементи.
Използване на ExpectedConditions
Класът ExpectedConditions предлага по-широк набор от условия, които можете да използвате заедно с метода until() на WebDriverWait.
По-долу са някои от най-често срещаните методи на ExpectedConditions.
- alertIsPresent() – изчаква, докато се покаже поле за предупреждение.
- elementToBeClickable() – Изчаква, докато даден елемент стане видим и в същото време активиран. Пробата Selenium Кодът по-долу ще изчака, докато елементът с id=”username” стане видим и първо активиран, преди да присвои този елемент като променлива на WebElement с име “txtUserName”.
- frameToBeAvailableAndSwitchToIt() – Изчаква дадения кадър да е вече наличен и след това автоматично превключва към него.
Улавяне на изключения
Когато използвате isEnabled(), isDisplayed() и isSelected(), WebDriver приема, че елементът вече съществува на страницата. В противен случай ще хвърли a NoSuchElementException. За да избегнем това, трябва да използваме блок try-catch, така че програмата да не бъде прекъсната.
WebElement txtbox_username = driver.findElement(By.id("username")); try{ if(txtbox_username.isEnabled()){ txtbox_username.sendKeys("tutorial"); } } catch(NoSuchElementException nsee){ System.out.println(nsee.toString()); }
Ако използвате изрично изчакване, типът изключение, което трябва да хванете, е „TimeoutException“.
Oбобщение
- За да започнете да използвате API на WebDriver, трябва да импортирате поне тези два пакета.
- org.openqa.selenium.*
- org.openqa.selenium.firefox.Firefoxдрайвер
- -
get()
метод е еквивалент на Selenium Команда „open“ на IDE. - Намирането на елементи в WebDriver се извършва с помощта на
findElement()
метод. - Следните са наличните опции за локализиране на елементи в WebDriver:
- By.className
- Чрез.cssSelector
- By.id
- By.linkText
- По име
- By.partialLinkText
- By.tagName
- По.xpath
- By.cssSelector() не подкрепа на "съдържа" функция.
- Можете да създадете екземпляр на елемент с помощта на класа WebElement.
- Щракването върху елемент се извършва с помощта на
click()
метод. - WebDriver предоставя тези полезни команди за получаване:
- получи ()
- getTitle()
- getPageSource()
- getCurrentUrl()
- getText()
- WebDriver предоставя тези полезни команди за навигация
- навигация().напред()
- навигация().назад()
- навигация().към()
- navigate().refresh()
- Методите close() и quit() се използват за затваряне на прозорците на браузъра.
Close()
използва се за затваряне на един прозорец; докатоquit()
се използва за затваряне на всички прозорци, свързани с родителския прозорец, който обектът WebDriver контролира. - -
switchTo().frame()
намляваswitchTo().alert()
методите се използват за насочване на фокуса на WebDriver съответно към рамка или предупреждение. Implicit waits
се използват за задаване на времето за изчакване през цялата програма, докатоexplicit waits
се използват само на определени порции.- Можете да използвате isEnabled(), isDisplayed(),isSelected() и комбинация от WebDriverWait намлява Очаквани условия методи при проверка на състоянието на даден елемент. Те обаче не проверяват дали елементът не съществува.
- Когато isEnabled(), isDisplayed() или isSelected() е извикан, докато елементът не съществува, WebDriver ще хвърли NoSuchElementException.
- Когато методите WebDriverWait и ExpectedConditions бяха извикани, докато елементът не съществуваше, WebDriver хвърляше
TimeoutException
.
Забележка:
driver.get()
: Този метод се използва за навигиране до определен уебсайт. Той обаче не поддържа история на браузъра или бисквитки. В резултат на това бутоните напред и назад няма да работят и щракването върху тях няма да планира навигацията на страницата.
driver.navigate()
: Този метод се използва и за навигиране до конкретен уебсайт, но той поддържа хронология на браузъра и бисквитки. Това позволява бутоните напред и назад да се използват за навигация между страниците, докато кодирате тестов случай.