Tập lệnh trình duyệt web Selenium đầu tiên: Ví dụ về mã mẫu JAVA

Mục lục:

Anonim

Sử dụng lớp Java "myclass" mà chúng tôi đã tạo trong hướng dẫn trước, chúng ta hãy thử tạo một tập lệnh WebDriver sẽ:

  1. tìm nạp trang chủ của Mercury Tours '
  2. xác minh tiêu đề của nó
  3. in ra kết quả so sánh
  4. đóng nó trước khi kết thúc toàn bộ chương trình.

Mã WebDriver

Dưới đây là mã WebDriver thực tế cho logic được trình bày bởi tình huống trên

Lưu ý: Khởi động Firefox 35, bạn cần sử dụng trình điều khiển gecko do Mozilla tạo để sử dụng Trình điều khiển web. 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 các tập lệnh của mình trên Chrome. Selenium hoạt động hiệu quả 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

gói mới dự án;nhập org.openqa.selenium.WebDriver;nhập org.openqa.selenium.firefox.FirefoxDriver;// bình luận dòng trên và bỏ ghi chú dòng dưới để sử dụng Chrome// nhập org.openqa.selenium.chrome.ChromeDriver;lớp công khai PG1 {public static void main (String [] args) {// khai báo và khởi tạo đối tượng / biếnSystem.setProperty ("webdriver.gecko.driver", "C: \\ geckodriver.exe");Trình điều khiển WebDriver = mới FirefoxDriver ();// comment 2 dòng trên và bỏ ghi chú dưới 2 dòng để sử dụng Chrome//System.setProperty("webdriver.chrome.driver","G:\\chromedriver.exe ");// Trình điều khiển WebDriver = new ChromeDriver ();String baseUrl = "http://demo.guru99.com/test/newtours/";StringainedTitle = "Chào mừng: Mercury Tours";Chuỗi thực tế = "";// khởi chạy Cáo lửa và hướng nó đến URL cơ sởdriver.get (baseUrl);// lấy giá trị thực của tiêu đềrealTitle = driver.getTitle ();/ ** so sánh tiêu đề thực tế của trang với tiêu đề mong đợi và in* kết quả là "Đạt" hoặc "Không đạt"* /if (Thực tếTitle.contentEquals (Dự kiếnTitle)) {System.out.println ("Đã vượt qua bài kiểm tra!");} khác {System.out.println ("Kiểm tra Không thành công");}//đóng Firefoxtrình điều khiển.close ();}}

Giải thích mã

Nhập các gói

Để bắt đầu, bạn cần nhập hai gói sau:

  1. org.openqa.selenium. * - chứa lớp WebDriver cần thiết để khởi tạo một trình duyệt mới được tải bằng một trình điều khiển cụ thể
  2. org.openqa.selenium.firefox.FirefoxDriver - chứa lớp FirefoxDriver cần thiết để khởi tạo trình điều khiển dành riêng cho Firefox trên trình duyệt do lớp WebDriver khởi tạo

Nếu bài kiểm tra của bạn cần các hành động phức tạp hơn như truy cập 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 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 một đối tượng trình điều khiển được khởi tạo.

Lớp FirefoxDriver không có tham số có nghĩa là cấu hình Firefox mặc định sẽ được khởi chạy bởi chương trình Java của chúng tôi. Cấu hình Firefox mặc định tương tự như khởi chạy Firefox ở chế độ an toàn (không có phần 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 các biến.

Khởi chạy phiên trình duyệt

Phương thức get () của WebDriver đượ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ố của nó.

Lấy tiêu đề trang thực tế

Lớp WebDriver có phương thức getTitle () luôn được sử dụng để lấy tiêu đề trang của trang hiện đang được tải.

So sánh giá trị mong đợi và giá trị thực tế

Phần mã này chỉ sử dụng cấu trúc if-else cơ bản của Java để so sánh tiêu đề thực tế với tiêu đề mong đợi.

Kết thúc phiên trình duyệt

Phương thức " close () " được sử dụng để đóng cửa sổ trình duyệt.

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ộ chương trình Java của bạn sẽ kết thúc trong khi vẫn mở cửa sổ trình duyệt.

Chạy thử nghiệm

Có hai cách để thực thi mã trong Eclipse IDE.

  1. Trên thanh menu của Eclipse, bấm Chạy> Chạy.
  2. Nhấn Ctrl + F11 để chạy toàn bộ mã.

Nếu bạn làm đúng mọi thứ, Eclipse sẽ xuất ra "Đã vượt qua thử nghiệm!"

Định vị các phần tử GUI

Định vị các phần tử trong WebDriver được thực hiện bằng cách sử dụng phương thức " findElement (By. Locator ()) ". Phần "định vị" của mã giống như bất kỳ trình định vị nào đã được thảo luận trước đây trong các chương Selenium IDE của các hướng dẫn này. Infact, bạn nên định vị các phần tử GUI bằng IDE và sau khi xác định thành công, hãy xuất mã sang WebDriver.

Đây là mã mẫu Selenium định vị một phần tử theo id của nó. Facebook được sử dụng làm URL cơ sở.

gói mới dự án;nhập org.openqa.selenium.By;nhập org.openqa.selenium.WebDriver;nhập org.openqa.selenium.firefox.FirefoxDriver;lớp công khai PG2 {public static void main (String [] args) {System.setProperty ("webdriver.gecko.driver", "C: \\ geckodriver.exe");Trình điều khiển WebDriver = mới FirefoxDriver ();String baseUrl = "http://www.facebook.com";String tagName = "";driver.get (baseUrl);tagName = driver.findElement (By.id ("email")). getTagName ();System.out.println (tagName);trình điều khiển.close ();System.exit (0);}}

Chúng tôi đã sử dụng phương thức getTagName () để 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ẻ "đầu vào" và sẽ in ra trên cửa sổ Bảng điều khiển của Eclipse.

Tóm tắt để định vị các phần tử

Biến thể Sự miêu tả Mẫu vật
Bởi. tên lớp tìm các phần tử dựa trên giá trị của thuộc tính "class" findElement (By.className ("someClassName"))
Bởi. cssSelector tìm các phần tử dựa trên công cụ Bộ chọn CSS cơ bản của trình điều khiển findElement (By.cssSelector ("input # email"))
Bởi. Tôi định vị các phần tử bằng giá trị của thuộc tính "id" của chúng findElement (By.id ("someId"))
Bởi. văn bản liên kết tìm 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ởi. Tên định vị các phần tử bằng giá trị của thuộc tính "name" findElement (By.name ("someName"))
Bởi. partLinkText xác định vị trí 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ử bằng tên thẻ của chúng findElement (By.tagName ("div"))
Bởi. 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 mã Selenium IDE bên dưới:

Trong Selenium IDE ở trên, toàn bộ bài kiểm tra đã vượt qua. Tuy nhiên, trong tập lệnh Selenium WebDriver bên dưới, thử nghiệm tương tự đã tạo ra lỗi vì WebDriver không hỗ trợ từ khóa "chứa" khi được sử dụng trong phương thức By.cssSelector ().

Các lệnh chung

Tạo 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 vào một phần tử

Nhấp có lẽ là cách phổ biến nhất để tương tác với các phần tử web . Phương thức click () được sử dụng để mô phỏng thao tác nhấp của bất kỳ phần tử nào. Ví dụ về Selenium Java sau đây cho thấy cách click () được sử dụng để nhấp vào nút "Đăng nhập" của Mercury Tours.

Những điều sau đây phải được 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 sẽ tự động chờ tải một 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 các thông tin quan trọng khác nhau về trang / phần tử. 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
get () Cách sử dụng mẫu:
  • Nó tự động mở một cửa sổ trình duyệt mới và tìm nạp trang mà bạn chỉ định bên trong dấu ngoặc đơn.
  • Nó là bản sao của lệnh "mở" của Selenium IDE.
  • Tham số phải là một đối tượng Chuỗi .
getTitle () Cách sử dụng mẫu:
  • Không cần tham số
  • Tìm nạp tiêu đề của trang hiện tại
  • Khoảng trắng ở đầu và cuối được cắt bớt
  • Trả về một chuỗi rỗng nếu trang không có tiêu đề
getPageSource () Cách sử dụng mẫu:
  • Không cần tham số
  • Trả về mã nguồn của trang dưới dạng giá trị Chuỗi
getCurrentUrl () Cách sử dụng mẫu:
  • Không cần tham số
  • Tìm nạp chuỗi đại diện cho URL hiện tại mà trình duyệt đang xem
getText () Cách sử dụng mẫu:
  • Tìm nạp văn bản bên trong của phần tử mà bạn chỉ định

Điều hướng các lệnh

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.

điều hướng (). to () Cách sử dụng mẫu:
  • Nó tự động mở một cửa sổ trình duyệt mới và tìm nạp trang mà bạn chỉ định bên trong dấu ngoặc đơn.
  • Nó thực hiện chính xác những điều tương tự như phương thức get ().
điều hướng (). refresh () Cách sử dụng mẫu:
  • Không cần tham số.
  • làm mới trang hiện tại.
điều hướng (). back () Cách sử dụng mẫu:
  • Không cần tham số
  • Đưa bạn trở lại một trang trong lịch sử của trình duyệt.
điều hướng (). forward () Cách sử dụng mẫu:
  • Không cần tham số
  • Đưa bạn chuyển tiếp một trang trên lịch sử của trình duyệt.

Đóng và thoát trình duyệt Windows

close () Cách sử dụng mẫu:
  • Không cần tham số
  • Nó chỉ đóng cửa sổ trình duyệt mà WebDriver hiện đang kiểm soát .
bỏ () Cách sử dụng mẫu:
  • Không cần tham số
  • Nó đóng tất cả các cửa sổ mà WebDriver đã mở.

Để minh họa rõ ràng sự khác biệt giữa close () và thoát (), hãy thử thực thi đoạn mã dưới đây. 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ở ra một cửa sổ khác sau khi thoát.

Lưu ý rằng chỉ có cửa sổ trình duyệt mẹ bị đóng chứ không phải hai cửa sổ bật lên.

Nhưng nếu bạn sử dụng lệnh thoát (), tất cả các cửa sổ sẽ bị đóng - không chỉ cửa sổ chính. Hãy thử chạy đoạn mã bên dưới và bạn sẽ nhận thấy rằng hai cửa sổ bật lên ở trên cũng sẽ tự động bị đóng lại.

gói mới dự án;nhập org.openqa.selenium.WebDriver;nhập org.openqa.selenium.firefox.FirefoxDriver;lớp công khai PG3 {public static void main (String [] args) {System.setProperty ("webdriver.gecko.driver", "C: \\ geckodriver.exe");Trình điều khiển WebDriver = mới FirefoxDriver ();driver.get ("http://www.popuptest.com/popuptest2.html");driver.quit (); // sử dụng QUIT tất cả các cửa sổ sẽ đóng}}

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 có thể truy cập các phần tử bên trong chúng. Ví dụ, chúng ta hãy lấy trang web http://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 liên kết "Không được chấp nhận" được bao quanh bằng 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 phương thức "switchTo (). Frame ()" . Chúng ta sẽ sử dụng thuộc tính name của frame làm tham số cho phần "frame ()".

gói mới dự án;nhập org.openqa.selenium.By;nhập org.openqa.selenium.WebDriver;nhập org.openqa.selenium.firefox.FirefoxDriver;lớp công cộng PG4 {public static void main (String [] args) {System.setProperty ("webdriver.gecko.driver", "C: \\ geckodriver.exe");Trình điều khiển WebDriver = mới FirefoxDriver ();driver.get ("http://demo.guru99.com/selenium/deprecated.html");driver.switchTo (). frame ("classFrame");driver.findElement (By.linkText ("Không được chấp nhận")). click ();trình điều khiển.close ();}}

Sau khi thực thi mã này, bạn sẽ thấy khung "classFrame" được đưa đến trang "API không được chấp nhận", có nghĩa là mã của chúng tôi đã có thể truy cập thành công liên kết "Không được chấp nhận".

Chuyển đổi giữa các cửa sổ bật lên

WebDriver cho phép các cửa sổ bật lên như cảnh báo được hiển thị, 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 mà nó chứa), chúng ta phải sử dụng phương thức "switchTo (). Alert ()" . Trong đoạn mã dưới đây, chúng tôi sẽ sử dụng phương pháp này để truy cập hộp cảnh báo và sau đó truy xuất thông báo của nó bằng phương thức "getText ()" , sau đó tự động đóng hộp cảnh báo bằng cách sử dụng "switchTo (). Alert (). Accept () " phương pháp.

Trước tiên, hãy truy cập http://jsbin.com/usidix/1 và nhấp vào nút "Go!" ở đó và tự xem nội dung tin nhắn.

Hãy xem mã ví dụ Selenium để thực hiện điều này-

gói mypackage;nhập org.openqa.selenium.By;nhập org.openqa.selenium.WebDriver;nhập org.openqa.selenium.firefox.FirefoxDriver;lớp công khai myclass {public static void main (String [] args) {System.setProperty ("webdriver.gecko.driver", "C: \\ geckodriver.exe");Trình điều khiển WebDriver = mới 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 bảng điều khiển Eclipse, lưu ý rằng thông báo cảnh báo được in là:

Chờ đợi

Có hai loại chờ đợi.

  1. Chờ ngầm - được sử dụng để đặt thời gian chờ mặc định trong suốt chương trình
  2. Chờ đợi rõ ràng - được sử dụng để đặt thời gian chờ chỉ cho một trường hợp cụ thể

Chờ đợi ngầm

  • Nó đơn giản hơn để viết mã hơn là Chờ đợi rõ ràng.
  • 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 đó, trên phần khởi tạo mã của bạn, hãy thêm phần này.

Chờ đợi rõ ràng

Chờ đợi rõ ràng được thực hiện bằng cách sử dụng các lớp WebDriverWait và Mong đợiCondition . Đối với ví dụ sau về Selenium WebDriver, chúng tôi 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. Đây là các bước.

Bước 1

Nhập hai gói sau:

Bước 2

Khai báo một 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 Điều kiện mong đợi trên các phần mà bạn cần chờ đợi rõ ràng. Trong trường hợp này, chúng tôi sẽ chờ đợi rõ ràng trên đầu vào "tên người dùng" (Trang chủ Mercury Tours) trước khi chúng tôi nhập văn bản "hướng dẫn" vào đó.

Điều kiện

Các phương thức sau được sử dụng trong các hoạt động lặp và lặp có điều kiện:

  • isEnabled () được sử dụng khi bạn muốn xác minh xem một phần tử nhất định có được bật hay không trước khi thực hiện một lệnh.
  • isDisplayed () được sử dụng khi bạn muốn xác minh xem một phần tử nhất định có được hiển thị hay không trước khi thực hiện một lệnh.
  • isSelected () được sử dụng khi bạn muốn xác minh xem một hộp kiểm, nút radio hoặc tùy chọn nhất định trong hộp thả xuống có được chọn hay không. Nó không hoạt động trên các phần tử khác.

Sử dụng điều kiện mong đợi

Lớp Mong đợiConditions cung cấp một 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 Điều kiện mong đợi phổ biến nhất.

  • alertIsPresent () - đợi cho đến khi hộp cảnh báo được hiển thị.
  • elementToBeClickable () - Chờ cho đến khi một phần tử hiển thị và đồng thời được kích hoạt. Mã Selenium mẫu bên dưới sẽ đợi cho đến khi phần tử với trở nên hiển thị và được kích hoạt đầu tiên trước khi gán phần tử đó làm biến WebElement có tên "txtUserName".
  • frameToBeAvailableAndSwitchToIt () - Chờ cho đến khi khung đã cho sẵn có 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 ra 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 ("tên người dùng"));thử{if (txtbox_username.isEnabled ()) {txtbox_username.sendKeys ("hướng dẫn");}}bắt (NoSuchElementException nsee) {System.out.println (nsee.toString ());}

Nếu bạn sử dụng các lần đợi rõ ràng, loại ngoại lệ mà bạn nên bắt là "TimeoutException".

Tóm lược

  • Để 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.FirefoxDriver
  • Phương thức get () tương đương với lệnh "mở" của Selenium IDE.
  • Định vị các phần tử trong WebDriver được thực hiện bằng cách sử dụng phương thức findElement () .
  • Sau đây là các tùy chọn có sẵn để định vị các phần tử trong WebDriver:
  • Bởi. tên lớp
  • Bởi. cssSelector
  • Bởi. Tôi
  • Bởi. văn bản liên kết
  • Bởi. Tên
  • Bởi. partLinkText
  • Bởi. tagName
  • Bởi. xpath
  • By.cssSelector () không hỗ trợ tính năng "chứa" .
  • Bạn có thể khởi tạo một phần tử bằng cách sử dụ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 phương thức click () .
  • 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 ()
  • Phương thức close () và thoát () được sử dụng để đóng các cửa sổ trình duyệt. Close () được sử dụng để đóng một cửa sổ duy nhất; trong khi thoát () được sử dụng để đóng tất cả các cửa sổ được liên kết với cửa sổ mẹ mà đối tượng WebDriver đang kiểm soát.
  • Phương thức switchTo (). Frame ()switchTo (). Alert () được sử dụng để hướng tiêu điểm của WebDriver vào khung hoặc cảnh báo tương ứng.
  • Các lần chờ ngầm được sử dụng để đặt thời gian chờ trong suốt chương trình, trong khi các lần chờ rõ ràng chỉ được sử dụng trên các phần cụ thể.
  • Bạn có thể sử dụng các phương thức isEnabled (), isDisplayed (), isSelected () và sự kết hợp của các phương thức WebDriverWaitmong đợi khi xác minh trạng thái của một phần tử. Tuy nhiên, họ không xác minh nếu phần tử không tồn tại.
  • Khi isEnabled (), isDisplayed () hoặc isSelected () được gọi trong khi phần tử không tồn tại, WebDriver sẽ ném một NoSuchElementException .
  • Khi các phương thức WebDriverWait và mong đợi được gọi trong khi phần tử không tồn tại, WebDriver sẽ ném ra một TimeoutException .

Ghi chú:

driver.get (): Nó được sử dụng để truy cập trang web cụ thể, nhưng nó không duy trì Lịch sử của trình duyệt và cookie, do đó, chúng tôi không thể sử dụng nút chuyển tiếp và lùi, nếu chúng tôi nhấp vào đó, trang sẽ không nhận được lịch biểu

driver.navigate (): nó được sử dụng để truy cập trang web cụ thể, nhưng nó duy trì lịch sử trình duyệt và cookie, vì vậy chúng tôi có thể sử dụng nút chuyển tiếp và lùi để điều hướng giữa các trang trong quá trình mã hóa Testcase