Selenium webdriver Java Ví dụ về chương trình
Selenium Java Ví dụ
Sử dụng Java class “myclass” mà chúng ta đã tạo trong hướng dẫn trước, chúng ta hãy thử tạo một tập lệnh WebDriver có thể:
Bước 1: lấy Mercury Trang chủ của các tour du lịch
Bước 2: xác minh tiêu đề của nó
Bước 3: in ra kết quả so sánh
Bước 4: đóng nó trước khi kết thúc toàn bộ chương trình.
Selenium Mã mẫu WebDriver
Dưới đây là mã WebDriver thực tế cho logic được trình bày trong kịch bản trên
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(); } }
Lưu ý: Bắt đầu Firefox 35, bạn cần sử dụng driver gecko do Mozilla tạo ra để sử dụng Web Driver. Selenium 3.0, gecko và firefox có vấn đề về khả năng tương thích và việc thiết lập chúng một cách chính xác có thể trở thành một nhiệm vụ khó khăn. Nếu mã không hoạt động, hãy hạ cấp xuống Firefox phiên bản 47 trở xuống. Ngoài ra, bạn có thể chạy tập lệnh của mình trên Chrome. Selenium hoạt động ngay lập tức cho Chrome. Bạn chỉ cần thay đổi 3 dòng mã để làm cho tập lệnh của bạn hoạt động với Chrome hoặc Firefox
Giải thích mã
Nhập gói
Để bắt đầu, bạn cần nhập hai gói sau:
- org.openqa.selenium.*– chứa lớp WebDriver cần thiết để khởi tạo trình duyệt mới được tải bằng trình điều khiển cụ thể
- org.openqa.selenium.firefox.FirefoxNgười lái xe - chứa FirefoxLớp trình điều khiển cần thiết để khởi tạo một Firefox-trình điều khiển cụ thể trên trình duyệt được khởi tạo bởi lớp WebDriver
Nếu bài kiểm tra của bạn cần những hành động phức tạp hơn như truy cập một lớp khác, chụp ảnh màn hình trình duyệt hoặc thao tác với các tệp bên ngoài, chắc chắn bạn sẽ cần phải nhập thêm gói.
Khởi tạo các đối tượng và biến
Thông thường, đây là cách khởi tạo một đối tượng trình điều khiển.
WebDriver driver = new FirefoxDriver();
A FirefoxLớp trình điều khiển không có tham số có nghĩa là mặc định Firefox hồ sơ sẽ được đưa ra bởi chúng tôi Java chương trình. Mặc định Firefox hồ sơ tương tự như khởi chạy Firefox ở chế độ an toàn (không có tiện ích mở rộng nào được tải).
Để thuận tiện, chúng tôi đã lưu URL cơ sở và tiêu đề dự kiến dưới dạng biến.
Khởi chạy phiên trình duyệt
WebDriver được() được sử dụng để khởi chạy một phiên trình duyệt mới và hướng nó đến URL mà bạn chỉ định làm tham số.
driver.get(baseUrl);
Lấy tiêu đề trang thực tế
Lớp WebDriver có getTitle() phương thức luôn được sử dụng để lấy tiêu đề trang của trang hiện đang được tải.
actualTitle = driver.getTitle();
So sánh giá trị mong đợi và giá trị thực tế
Phần mã này chỉ đơn giản sử dụng một mã cơ bản Java cấu trúc if-else để so sánh tiêu đề thực tế với tiêu đề dự kiến.
if (actualTitle.contentEquals(expectedTitle)){ System.out.println("Test Passed!"); } else { System.out.println("Test Failed"); }
Chấm dứt phiên trình duyệt
Các "đóng()” được sử dụng để đóng cửa sổ trình duyệt.
driver.close();
Chấm dứt toàn bộ chương trình
Nếu bạn sử dụng lệnh này mà không đóng tất cả các cửa sổ trình duyệt trước, toàn bộ Java chương trình sẽ kết thúc trong khi vẫn để cửa sổ trình duyệt mở.
System.exit(0);
Chạy thử nghiệm
Có hai cách để thực thi mã trong Eclipse SDI.
- On Eclipsethanh menu của, hãy nhấp vào Chạy > Chạy.
- Ấn Bản Ctrl + F11 để chạy toàn bộ mã.
Nếu bạn đã làm mọi thứ một cách chính xác, Eclipse sẽ xuất ra “Đã vượt qua bài kiểm tra!”
Định vị các thành phần GUI
Việc định vị các phần tử trong WebDriver được thực hiện bằng cách sử dụng “findElement(By.định vị())" phương pháp. Phần “định vị” của mã giống như bất kỳ bộ định vị nào được thảo luận trước đó trong phần Selenium IDE các chương của những hướng dẫn này. Trên thực tế, bạn nên định vị các thành phần GUI bằng IDE và sau khi xác định thành công, hãy xuất mã sang WebDriver.
Dưới đây là một Selenium mã mẫu định vị một phần tử theo id của nó. Facebook được sử dụng làm URL cơ sở.
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); } }
Chúng tôi sử dụng getTagName() phương pháp để trích xuất tên thẻ của phần tử cụ thể có id là “email”. Khi chạy, mã này sẽ có thể xác định chính xác tên thẻ “input” và sẽ in ra trên Eclipsecửa sổ Console của.
Tóm tắt về việc định vị các phần tử
Biến thể | Mô tả Chi tiết | Mâu |
---|---|---|
Bởi.className | tìm các phần tử dựa trên giá trị của thuộc tính “class” | findElement(By.className(“someClassName”)) |
By.cssSelector | tìm các phần tử dựa trên công cụ CSS Selector cơ bản của trình điều khiển | findElement(Bởi.cssSelector(“đầu vào#email”)) |
Bởi.id | định vị các phần tử theo giá trị của thuộc tính “id” của chúng |
findElement(By.id(“someId”)) |
By.linkText | tìm thấy một phần tử liên kết theo văn bản chính xác mà nó hiển thị |
findElement(By.linkText(“ĐĂNG KÝ”)) |
Bằng tên | định vị các phần tử theo giá trị của thuộc tính “name” |
findElement(By.name(“someName”)) |
By.partialLinkText | định vị các phần tử có chứa văn bản liên kết đã cho |
findElement(By.partialLinkText(“REG”)) |
Bởi.tagName | định vị các phần tử theo tên thẻ của chúng |
findElement(By.tagName(“div”)) |
By.xpath | định vị các phần tử thông qua 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]”)) |
Lưu ý khi sử dụng findElement(By.cssSelector())
By.cssSelector()
không hỗ trợ tính năng “chứa”. Hãy xem xét Selenium Mã IDE bên dưới -
In Selenium IDE ở trên, toàn bộ bài kiểm tra đã đạt. Tuy nhiên trong Selenium Tập lệnh WebDriver bên dưới, quá trình kiểm tra tương tự đã tạo ra lỗi do WebDriver không hỗ trợ từ khóa “contains” khi được sử dụng trong phương thức By.cssSelector().
Các lệnh chung
Khởi tạo các phần tử web
Thay vì sử dụng cú pháp dài “driver.findElement(By.locator())” mỗi khi bạn truy cập vào một phần tử cụ thể, chúng ta có thể khởi tạo một đối tượng WebElement cho nó. Lớp WebElement được chứa trong gói “org.openqa.selenium.*”.
Nhấp chuột vào một phần tử
Nhấp chuột có lẽ là cách tương tác phổ biến nhất với các thành phần web. Các click()
phương pháp được sử dụng để mô phỏng việc nhấp vào bất kỳ phần tử nào. Sau đây Selenium Java ví dụ cho thấy cách click()
đã được sử dụng để bấm vào Mercury Nút “Đăng nhập” của chuyến tham quan.
Những điều sau đây cần lưu ý khi sử dụng phương thức click().
- Nó không nhận bất kỳ tham số/đối số nào.
- Phương pháp này tự động chờ tải trang mới nếu có.
- Phần tử được nhấp vào phải hiển thị (chiều cao và chiều rộng không được bằng 0).
Nhận lệnh
Nhận lệnh tìm nạp nhiều thông tin quan trọng khác nhau về trang/thành phần. Dưới đây là một số lệnh “get” quan trọng mà bạn phải làm quen.
Lệnh | Sử dụng |
---|---|
được()
Sử dụng mẫu: |
|
getTitle()
Sử dụng mẫu: |
|
getPageSource()
Sử dụng mẫu: |
|
getCurrentUrl()
Sử dụng mẫu: |
|
getText ()
Sử dụng mẫu: |
|
Lệnh điều hướng
Các lệnh này cho phép bạn làm mới, truy cập và chuyển đổi qua lại giữa các trang web khác nhau.
hướng đến()
Sử dụng mẫu: |
|
điều hướng().refresh()
Sử dụng mẫu: |
|
điều hướng().back()
Sử dụng mẫu: |
|
điều hướng().forward()
Sử dụng mẫu: |
|
Đóng và thoát trình duyệt Windows
đóng()
Sử dụng mẫu: |
|
bỏ ()
Sử dụng mẫu: |
|
Để minh họa rõ ràng sự khác biệt giữa close()
và quit()
, hãy thử thực thi mã bên dưới. Nó sử dụng một trang web tự động bật lên một cửa sổ khi tải trang và mở một cửa sổ khác sau khi thoát.
Lưu ý rằng chỉ có cửa sổ trình duyệt chính bị đóng chứ không phải hai cửa sổ bật lên.
Nhưng nếu bạn sử dụng quit(), tất cả các cửa sổ sẽ được đóng lại – không chỉ cửa sổ cha. Hãy thử chạy mã bên dưới và bạn sẽ thấy rằng hai cửa sổ bật lên ở trên cũng sẽ tự động được đóng lại.
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 } }
Chuyển đổi giữa các khung hình
Để truy cập các phần tử GUI trong Khung, trước tiên chúng ta nên hướng WebDriver tập trung vào khung hoặc cửa sổ bật lên trước khi chúng ta có thể truy cập các phần tử bên trong chúng. Chúng ta hãy lấy ví dụ, trang web https://demo.guru99.com/selenium/deprecated.html
Trang này có 3 khung có thuộc tính “tên” được chỉ ra ở trên. Chúng tôi muốn truy cập vào liên kết “Không dùng nữa” được bao quanh màu vàng ở trên. Để làm được điều đó, trước tiên chúng ta phải hướng dẫn WebDriver chuyển sang khung “classFrame” bằng cách sử dụng “switchTo().frame()” phương pháp. Chúng ta sẽ sử dụng thuộc tính name của frame làm tham số cho phần “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(); } }
Sau khi thực thi mã này, bạn sẽ thấy khung “classFrame” được đưa đến trang “API không dùng nữa”, nghĩa là mã của chúng tôi đã có thể truy cập thành công vào liên kết “Không dùng nữa”.
Chuyển đổi giữa các cửa sổ bật lên Windows
WebDriver cho phép hiển thị các cửa sổ bật lên như cảnh báo, không giống như trong Selenium IDE. Để truy cập các phần tử bên trong cảnh báo (chẳng hạn như thông báo chứa trong đó), chúng ta phải sử dụng "switchTo().alert()"
phương pháp. Trong đoạn mã dưới đây, chúng ta sẽ sử dụng phương pháp này để truy cập hộp cảnh báo và sau đó lấy lại thông báo của nó bằng cách sử dụng "getText()"
phương pháp, và sau đó tự động đóng hộp cảnh báo bằng cách sử dụng "switchTo().alert().accept()"
phương pháp.
Đầu tiên, hãy đến https://output.jsbin.com/usidix/1 và nhấp vào nút “Go!” theo cách thủ công. nhấn vào đó và tự mình xem nội dung tin nhắn.
Hãy xem Selenium mã ví dụ để làm điều này-
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(); } }
trên Eclipse console, hãy lưu ý rằng thông báo cảnh báo được in là:
Chờ đợi
Có hai loại chờ đợi.
- Chờ đợi tiềm ẩn - được sử dụng để đặt thời gian chờ mặc định trong suốt chương trình
- Chờ rõ ràng - được sử dụng để chỉ đặt thời gian chờ cho một trường hợp cụ thể
Chờ đợi ngầm
- Việc viết mã đơn giản hơn so với Explicit Waits.
- Nó thường được khai báo trong phần khởi tạo của mã.
- Bạn sẽ chỉ cần một gói bổ sung để nhập.
Để bắt đầu sử dụng chế độ chờ ngầm, bạn sẽ phải nhập gói này vào mã của mình.
Sau đó, ở phần khởi tạo mã của bạn, hãy thêm phần này.
Chờ đợi rõ ràng
Việc chờ đợi rõ ràng được thực hiện bằng cách sử dụng các lớp WebDriverWait và ExpectedCondition. Đối với những điều sau đây Selenium Ví dụ về WebDriver, chúng ta sẽ đợi tối đa 10 giây để một phần tử có id là “tên người dùng” hiển thị trước khi tiếp tục lệnh tiếp theo. Dưới đây là các bước.
Bước 1:
Nhập hai gói này:
Bước 2:
Khai báo biến WebDriverWait. Trong ví dụ này, chúng tôi sẽ sử dụng “myWaitVar” làm tên của biến.
Bước 3:
Sử dụng myWaitVar với ExpectedConditions ở những phần mà bạn cần chờ đợi rõ ràng. Trong trường hợp này, chúng tôi sẽ sử dụng tính năng chờ rõ ràng đối với “tên người dùng” (Mercury Tours HomePage) trước khi chúng ta nhập văn bản “hướng dẫn” vào đó.
Điều kiện
Các phương pháp sau đây được sử dụng trong các hoạt động có điều kiện và lặp —
- được kích hoạt() được sử dụng khi bạn muốn xác minh xem một phần tử nào đó có được bật hay không trước khi thực hiện lệnh.
- được hiển thị() được sử dụng khi bạn muốn xác minh xem một phần tử nào đó có được hiển thị hay không trước khi thực hiện lệnh.
- đã được chọn() được sử dụng khi bạn muốn xác minh xem một điều gì đó nhất định hộp kiểm, nút radio hoặc tùy chọn trong hộp thả xuống đã được chọn. Nó không hoạt động trên các yếu tố khác.
Sử dụng các điều kiện dự kiến
Lớp ExpectedConditions cung cấp tập hợp các điều kiện rộng hơn mà bạn có thể sử dụng cùng với phương thức Until() của WebDriverWait.
Dưới đây là một số phương pháp ExpectedConditions phổ biến nhất.
- cảnh báoIsPresent() – chờ cho đến khi hộp cảnh báo được hiển thị.
- elementToBeClickable() – Chờ cho đến khi một phần tử được hiển thị và đồng thời được bật. Mẫu Selenium Mã bên dưới sẽ đợi cho đến khi phần tử có id=”username” hiển thị và được bật trước khi gán phần tử đó làm biến WebElement có tên “txtUserName”.
- frameToBeAvailableAndSwitchToIt() – Chờ cho đến khi khung nhất định đã có sẵn rồi tự động chuyển sang khung đó.
Bắt ngoại lệ
Khi sử dụng isEnabled(), isDisplayed() và isSelected(), WebDriver giả định rằng phần tử đã tồn tại trên trang. Nếu không, nó sẽ ném một NoSuchElementException. Để tránh điều này chúng ta nên sử dụng khối try-catch để chương trình không bị gián đoạn.
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()); }
Nếu bạn sử dụng chế độ chờ rõ ràng, loại ngoại lệ bạn nên nắm bắt là “TimeoutException”.
Tổng kết
- Để bắt đầu sử dụng API WebDriver, bạn phải nhập ít nhất hai gói này.
- org.openqa.selenium.*
- org.openqa.selenium.firefox.FirefoxNgười lái xe
-
get()
phương pháp tương đương với Selenium Lệnh “mở” của IDE. - Việc định vị các phần tử trong WebDriver được thực hiện bằng cách sử dụng
findElement()
phương pháp. - Sau đây là các tùy chọn có sẵn để định vị các thành phần trong WebDriver:
- Bởi.className
- By.cssSelector
- Bởi.id
- By.linkText
- Bằng tên
- By.partialLinkText
- Bởi.tagName
- By.xpath
- By.cssSelector() không hỗ trợ "chứa" tính năng này.
- Bạn có thể khởi tạo một phần tử bằng lớp WebElement.
- Việc nhấp vào một phần tử được thực hiện bằng cách sử dụng
click()
phương pháp. - WebDriver cung cấp các lệnh get hữu ích sau:
- được()
- getTitle()
- getPageSource()
- getCurrentUrl()
- getText ()
- WebDriver cung cấp các lệnh điều hướng hữu ích này
- điều hướng().forward()
- điều hướng().back()
- hướng đến()
- điều hướng().refresh()
- Các phương thức close() và quit() được sử dụng để đóng cửa sổ trình duyệt.
Close()
được sử dụng để đóng một cửa sổ duy nhất; trong khiquit()
được sử dụng để đóng tất cả các cửa sổ được liên kết với cửa sổ cha mà đối tượng WebDriver đang kiểm soát. -
switchTo().frame()
vàswitchTo().alert()
các phương thức được sử dụng để hướng sự tập trung của WebDriver vào một khung hoặc cảnh báo tương ứng. Implicit waits
được sử dụng để đặt thời gian chờ trong suốt chương trình, trong khiexplicit waits
chỉ được sử dụng trên các phần cụ thể.- Bạn có thể sử dụng isEnabled(), isDisplayed(),isSelected() và kết hợp các WebDriverĐợi và Điều kiện dự kiến phương pháp khi xác minh trạng thái của một phần tử. Tuy nhiên, họ không xác minh xem phần tử đó có tồn tại hay không.
- Khi isEnabled(), isDisplayed() hoặc isSelected() được gọi trong khi phần tử không tồn tại, WebDriver sẽ đưa ra một NoSuchElementException.
- Khi các phương thức WebDriverWait và ExpectedConditions được gọi trong khi phần tử không tồn tại, WebDriver sẽ đưa ra một
TimeoutException
.
Lưu ý:
driver.get()
: Phương pháp này được sử dụng để điều hướng đến một trang web cụ thể. Tuy nhiên, nó không lưu giữ lịch sử trình duyệt hoặc cookie. Do đó, các nút tiến và lùi sẽ không hoạt động và việc nhấp vào chúng sẽ không lên lịch điều hướng trang.
driver.navigate()
: Phương pháp này cũng được sử dụng để điều hướng đến một trang web cụ thể, nhưng nó duy trì lịch sử trình duyệt và cookie. Điều này cho phép sử dụng các nút tiến và lùi để điều hướng giữa các trang trong khi mã hóa một trường hợp thử nghiệm.