Selenium Webdriver Java Programpélda (mintakód)
Selenium Java Példa
az Java Az előző oktatóanyagban létrehozott „myclass” osztályban próbáljunk meg létrehozni egy WebDriver szkriptet, amely:
Lépés 1: lekérés Mercury Tours honlapja
Lépés 2: ellenőrizze a címét
Lépés 3: nyomtassa ki az összehasonlítás eredményét
Lépés 4: zárja be a teljes program befejezése előtt.
Selenium WebDriver mintakód
Az alábbiakban látható a tényleges WebDriver kód a fenti forgatókönyv által bemutatott logikához
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 = "http://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(); } }
Megjegyzés: Indítás Firefox 35, a Web Driver használatához a Mozilla által létrehozott gecko illesztőprogramot kell használnia. Selenium 3.0, a gecko és a firefox kompatibilitási problémái vannak, és ezek helyes beállítása nehézkes feladat lehet. Ha a kód nem működik, váltson vissza a következőre Firefox 47-es vagy régebbi verzió. Alternatív megoldásként futtathatja a szkripteket a Chrome-on. Selenium a Chrome-hoz már kiindulva működik. Csak 3 sor kódot kell módosítania, hogy a szkript működjön a Chrome-mal vagy Firefox
A kód magyarázata
Csomagok importálása
A kezdéshez a következő két csomagot kell importálnia:
- org.openqa.selenium.*– tartalmazza a WebDriver osztályt, amely egy adott meghajtóval betöltött új böngésző példányosításához szükséges
- org.openqa.selenium.firefox.FirefoxVezető – tartalmazza a FirefoxA példányosításhoz szükséges járművezetői osztály a Firefox-specifikus illesztőprogram a WebDriver osztály által példányosított böngészőbe
Ha a tesztnek bonyolultabb műveletekre van szüksége, mint például egy másik osztály elérése, a böngésző képernyőképeinek készítése vagy a külső fájlok manipulálása, akkor feltétlenül több csomagot kell importálnia.
Objektumok és változók példányosítása
Normális esetben egy illesztőprogram-objektum példányosítása így történik.
WebDriver driver = new FirefoxDriver();
A FirefoxA paraméterek nélküli illesztőprogram-osztály azt jelenti, hogy az alapértelmezett Firefox profilt indítjuk el Java program. Az alapértelmezett Firefox profil hasonló az indításhoz Firefox csökkentett módban (nincs bővítmény betöltve).
A kényelem kedvéért változóként mentettük az alap URL-t és a várt címet.
Böngésző munkamenet indítása
WebDriver get () metódussal indítható el egy új böngésző munkamenet, és a paraméterként megadott URL-re irányítja azt.
driver.get(baseUrl);
Szerezze meg az oldal tényleges címét
A WebDriver osztály rendelkezik a getTitle() módszer, amelyet mindig az aktuálisan betöltött oldal oldalcímének lekérésére használnak.
actualTitle = driver.getTitle();
Hasonlítsa össze a várható és tényleges értékeket
A kód ezen része egyszerűen egy alapszintet használ Java if-else struktúra a tényleges cím és a várt cím összehasonlításához.
if (actualTitle.contentEquals(expectedTitle)){ System.out.println("Test Passed!"); } else { System.out.println("Test Failed"); }
Böngészési munkamenet megszakítása
AzBezárás()” metódus használható a böngészőablak bezárására.
driver.close();
A teljes program megszüntetése
Ha úgy használja ezt a parancsot, hogy nem zárja be először az összes böngészőablakot, akkor az egész Java A program leáll, miközben a böngésző ablak nyitva marad.
System.exit(0);
A teszt futtatása
Kétféle módon lehet kódot végrehajtani Eclipse SDI.
- On Eclipsemenüsorán kattintson Futtatás > Futtatás.
- nyomja meg Ctrl + F11 a teljes kód futtatásához.
Ha mindent jól csináltál, Eclipse a „Teszt sikeres!”
GUI-elemek megkeresése
Az elemek megtalálása a WebDriverben a „findElement(By.lokátor()” módszerrel. A kód „helymeghatározó” része megegyezik a korábban tárgyalt helymeghatározók bármelyikével Selenium IDE ezeknek az oktatóanyagoknak a fejezetei. Valójában azt javasoljuk, hogy az IDE segítségével keresse meg a GUI-elemeket, és a sikeres azonosítás után exportálja a kódot a WebDriver-ba.
Itt van egy Selenium mintakód, amely egy elemet az azonosítója alapján keres meg. A Facebook alap URL-ként szolgál.
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); } }
Mi használtuk a getTagName() módszer az adott elem címkenevének kinyerésére, amelynek azonosítója „email”. Futtatáskor ennek a kódnak képesnek kell lennie az „input” címkenév helyes azonosítására, és ki kell nyomtatnia Eclipsea Konzol ablakában.
Összefoglalás az elemek helymeghatározásához
Variáció | Description | Minta |
---|---|---|
By.className | elemeket talál az „class” attribútum értéke alapján | findElement(By.className(“valamilyenOsztálynév”)) |
Készítette.cssSelector | megkeresi az elemeket az illesztőprogram mögöttes CSS Selector motorja alapján | findElement(By.cssSelector(“bemenet#email”)) |
By.id | az elemeket az „id” attribútum értéke alapján keresi meg |
findElement(By.id("someId") |
By.linkText | pont az általa megjelenített szöveg alapján talál hivatkozáselemet |
findElement(By.linkText("REGISZTRÁCIÓ") |
Név szerint | az elemeket a „name” attribútum értéke alapján keresi meg |
findElement(By.name("someName") |
By.partialLinkText | megkeresi az adott linkszöveget tartalmazó elemeket |
findElement(By.partialLinkText("REG") |
By.tagName | megkeresi az elemeket a címkenév alapján |
findElement(By.tagName("div") |
By.xpath | XPath segítségével találja meg az elemeket |
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]”)) |
Megjegyzés a findElement(By.cssSelector()) használatával kapcsolatban
By.cssSelector()
nem támogatja a „tartalmaz” funkciót. Fontolja meg a Selenium IDE kód lent –
In Selenium A fenti IDE, a teljes teszt sikeres volt. Azonban a Selenium Az alábbi WebDriver szkript, ugyanaz a teszt hibát generált, mert a WebDriver nem támogatja a „contains” kulcsszót, amikor a By.cssSelector() metódusban használják.
Közös parancsok
Webelemek példányosítása
Ahelyett, hogy a hosszú „driver.findElement(By.locator())” szintaxist használnánk minden alkalommal, amikor hozzáférünk egy adott elemhez, példányosíthatunk hozzá egy WebElement objektumot. A WebElement osztályt az „org.openqa.selenium.*” csomag tartalmazza.
Egy elemre kattintva
A kattintás talán a webes elemekkel való interakció leggyakoribb módja. A click()
módszer bármely elem kattintásának szimulálására szolgál. A következő Selenium Java példa mutatja, hogyan click()
kattintásra használták Mercury A Tours „Bejelentkezés” gombja.
A click() metódus használatakor a következőket kell figyelembe venni.
- Nem igényel paramétert/argumentumot.
- A módszer automatikusan megvárja az új oldal betöltését, ha szükséges.
- A rákattintandó elemnek láthatónak kell lennie (magassága és szélessége nem lehet nulla).
Get Commands
A Get parancsok különféle fontos információkat kérnek le az oldalról/elemről. Íme néhány fontos „get” parancs, amelyeket ismernie kell.
Parancsok | Használat |
---|---|
get ()
Használati minta: |
|
getTitle()
Használati minta: |
|
getPageSource()
Használati minta: |
|
getCurrentUrl()
Használati minta: |
|
getText()
Használati minta: |
|
Navigációs parancsok
Ezek a parancsok lehetővé teszik a különböző weboldalak frissítését, belépését és oda-vissza váltását.
navigate().to()
Használati minta: |
|
navigate().refresh()
Használati minta: |
|
navigate().back()
Használati minta: |
|
navigate().forward()
Használati minta: |
|
A böngésző bezárása és kilépése Windows
Bezárás()
Használati minta: |
|
Kilépés()
Használati minta: |
|
Hogy világosan szemléltesse a különbséget close()
és a quit()
, próbálja meg végrehajtani az alábbi kódot. Olyan weboldalt használ, amely automatikusan felugrik egy ablakot az oldal betöltésekor, és megnyit egy másikat a kilépés után.
Figyelje meg, hogy csak a szülőböngésző ablak volt bezárva, a két felugró ablak nem.
De ha a quit() parancsot használja, akkor minden ablak bezárul – nem csak a szülő. Próbálkozzon az alábbi kód futtatásával, és észre fogja venni, hogy a fenti két felugró ablak is automatikusan bezárul.
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 } }
Váltás a keretek között
A keretben lévő grafikus felület elemeinek eléréséhez először a WebDrivert kell irányítanunk, hogy a keretre vagy a felugró ablakra összpontosítson, mielőtt hozzáférhetnénk a bennük lévő elemekhez. Vegyük például a weboldalt http://demo.guru99.com/selenium/deprecated.html
Ezen az oldalon 3 keret található, amelyek „name” attribútumait fentebb jeleztük. Szeretnénk elérni a fenti, sárgával körülvett „Elavult” hivatkozást. Ehhez először utasítanunk kell a WebDrivert, hogy váltson a „classFrame” keretre a "switchTo().frame()" módszer. A „frame()” rész paramétereként a frame name attribútumot fogjuk használni.
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("http://demo.guru99.com/selenium/deprecated.html"); driver.switchTo().frame("classFrame"); driver.findElement(By.linkText("Deprecated")).click(); driver.close(); } }
A kód végrehajtása után látni fogja, hogy a „classFrame” keret az „Elavult API” oldalra kerül, ami azt jelenti, hogy kódunk sikeresen hozzáfért az „Elavult” hivatkozáshoz.
Váltás a felugró ablakok között Windows
A WebDriver lehetővé teszi a felugró ablakok, például a figyelmeztetések megjelenítését, ellentétben az in Selenium IDE. A riasztáson belüli elemek (például a benne lévő üzenet) eléréséhez használnunk kell a "switchTo().alert()"
módszer. Az alábbi kódban ezt a módszert használjuk a figyelmeztető mező eléréséhez, majd az üzenet lekéréséhez a "getText()"
módszert, majd automatikusan zárja be a figyelmeztető ablakot a gombbal "switchTo().alert().accept()"
módszer.
Először is menj oda https://output.jsbin.com/usidix/1 és manuálisan kattintson a "Go!" gombot ott, és nézze meg saját szemével az üzenet szövegét.
Lássuk a Selenium példa kód erre-
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(); } }
A Eclipse konzolon, vegye figyelembe, hogy a kinyomtatott figyelmeztető üzenet:
Vár
Kétféle várakozás létezik.
- Implicit várakozás – az alapértelmezett várakozási idő beállítására szolgál az egész programban
- Explicit várakozás – csak egy adott példány várakozási idejének beállítására szolgál
Implicit várakozás
- Egyszerűbb a kódolás, mint az Explicit Waits.
- Általában a kód példányosítási részében deklarálják.
- Csak egy további csomagra lesz szüksége az importáláshoz.
Az implicit várakozás használatához importálnia kell ezt a csomagot a kódjába.
Ezután adja hozzá ezt a kód példányosítási részéhez.
Kifejezett várakozás
Az explicit várakozás a WebDriverWait és az ExpectedCondition osztályok használatával történik. A következőkhöz Selenium A WebDriver példájában legfeljebb 10 másodpercig várunk, amíg egy „felhasználónév” azonosítójú elem láthatóvá válik, mielőtt a következő parancsra lépnénk. Itt vannak a lépések.
Lépés 1:
Importálja ezt a két csomagot:
Lépés 2:
Deklaráljon egy WebDriverWait változót. Ebben a példában a „myWaitVar” értéket fogjuk használni a változó neveként.
Lépés 3:
Használja a myWaitVar-t az ExpectedConditions paraméterrel azokon a részeken, ahol kifejezett várakozásra van szüksége. Ebben az esetben explicit várakozást fogunk használni a „felhasználónéven” (Mercury Tours HomePage) bevitelét, mielőtt beírnánk az „oktatóanyag” szöveget.
Körülmények
A következő módszereket alkalmazzák a feltételes és hurkolt műveletekben -
- engedélyezve() akkor használatos, ha egy parancs végrehajtása előtt ellenőrizni szeretné, hogy egy adott elem engedélyezve van-e vagy sem.
- isdisplayed() akkor használatos, ha egy parancs végrehajtása előtt ellenőrizni szeretné, hogy egy adott elem megjelenik-e vagy sem.
- isSelected() akkor használatos, ha ellenőrizni szeretné, hogy egy bizonyos jelölőnégyzetet, rádiógombot vagy opciót egy legördülő menüben van kiválasztva. Más elemeken nem működik.
Az ExpectedConditions használata
Az ExpectedConditions osztály a feltételek szélesebb körét kínálja, amelyeket a WebDriverWait till() metódusával együtt használhat.
Az alábbiakban bemutatjuk a leggyakoribb ExpectedConditions módszereket.
- alertIsPresent() – megvárja, amíg megjelenik egy figyelmeztető mező.
- elementToBeClickable() – Megvárja, amíg egy elem láthatóvá válik, és ezzel egyidejűleg engedélyezve lesz. A minta Selenium Az alábbi kód megvárja, amíg az id=”username” elem láthatóvá válik és engedélyezve lesz, mielőtt az elemet „txtUserName” nevű WebElement változóként rendeli hozzá.
- frameToLehetőÉs VáltsonToIt() – Megvárja, amíg az adott keret már elérhető, majd automatikusan átvált rá.
Kivételek elkapása
Az isEnabled(), isDisplayed() és isSelected() esetén a WebDriver feltételezi, hogy az elem már létezik az oldalon. Ellenkező esetben dobni fog a NoSuchElementException. Ennek elkerülésére használjunk try-catch blokkot, hogy a program ne szakadjon meg.
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()); }
Ha kifejezett várakozást használ, a kivétel típusa, amelyet el kell fognia, az „Időtúllépési kivétel”.
Összegzésként
- A WebDriver API használatának megkezdéséhez importálnia kell legalább ezt a két csomagot.
- org.openqa.selenium.*
- org.openqa.selenium.firefox.FirefoxVezető
- A
get()
módszer megfelelője Selenium Az IDE „open” parancsa. - Az elemek megtalálása a WebDriverben a következővel történik:
findElement()
módszer. - A következő lehetőségek állnak rendelkezésre az elemek megkeresésére a WebDriverben:
- By.className
- Készítette.cssSelector
- By.id
- By.linkText
- Név szerint
- By.partialLinkText
- By.tagName
- By.xpath
- A By.cssSelector() nem támogassa a "tartalmaz" funkciót.
- Egy elemet példányosíthat a WebElement osztály segítségével.
- Egy elemre kattintva a
click()
módszer. - A WebDriver ezeket a hasznos get parancsokat biztosítja:
- get ()
- getTitle()
- getPageSource()
- getCurrentUrl()
- getText()
- A WebDriver ezeket a hasznos navigációs parancsokat biztosítja
- navigate().forward()
- navigate().back()
- navigate().to()
- navigate().refresh()
- A close() és quit() metódusok a böngészőablakok bezárására szolgálnak.
Close()
egyetlen ablak bezárására szolgál; mígquit()
a WebDriver objektum által vezérelt szülőablakhoz társított összes ablak bezárására szolgál. - A
switchTo().frame()
és aswitchTo().alert()
metódusokat használnak arra, hogy a WebDriver fókuszát egy keretre vagy riasztásra irányítsák. Implicit waits
a várakozási idő beállítására szolgál az egész program során, mígexplicit waits
csak meghatározott adagokban használják.- Használhatja az isEnabled(), isDisplayed(),isSelected() és ezek kombinációját WebDriverVárjon és a Várható feltételek módszerek egy elem állapotának ellenőrzésére. Nem ellenőrzik azonban, hogy az elem nem létezik-e.
- Ha az isEnabled(), isDisplayed(), vagy isSelected() meghívásra került, miközben az elem nem létezett, a WebDriver egy NoSuchElementException.
- Amikor a WebDriverWait és az ExpectedConditions metódusokat meghívták, miközben az elem nem létezett, a WebDriver egy
TimeoutException
.
Jegyzet:
driver.get()
: Ezzel a módszerrel egy adott webhelyre navigálhat. Azonban nem tárolja a böngészési előzményeket vagy a cookie-kat. Emiatt az előre és hátra gombok nem működnek, és a rájuk kattintva nem ütemezi be az oldalnavigációt.
driver.navigate()
: Ezt a módszert egy adott webhelyre való navigálásra is használják, de a böngészési előzményeket és a sütiket is megőrzi. Ez lehetővé teszi az előre és vissza gombok használatát az oldalak közötti navigációhoz, miközben tesztesetet kódol.