0

Part3- Một số thuộc tính của Selenium Python Bindings

Ở bài viết trước các bạn đã biết căn bản về Selenium Python và một số thuộc tính Navigating, Interacting with the page, Filling in forms, Drag và Drop, Moving between windows and frames, Popup dialog, Navigation: History and location, Cookies, Locating Elements thông qua bài viết: https://viblo.asia/huong.quynh/posts/DzVGpobJvnW

Lần này các bạn sẽ biết thêm một số thuộc tính khác của Selenium Python

1. Locating by ID

Locating by ID được sử dụng khi bạn biết thuộc tính ID của element. Element đầu tiên khớp với giá trị thuộc tính id Location sẽ được trả lại, nếu không element nào khớp với thuộc tính id thì NoSuchElementException sẽ được hiển thị

<html>
 <body>
  <form id="loginForm">
   <input name="username" type="text" />
   <input name="password" type="password" />
   <input name="continue" type="submit" value="Login" />
  </form>
 </body>
<html>

Element có thể được xác định như sau:

login_form = driver.find_element_by_id('loginForm')

2. Locating by Name

Locating by Name được sử dụng khi bạn biết tên thuộc tính của một element. Với strategy này element đầu tiên khớp với tên thuộc tính thì location sẽ được trả lại. Nếu không có element nào khớp với tên thuộc tính thì NoSuchElementException sẽ được hiển thị.

<html>
 <body>
  <form id="loginForm">
   <input name="username" type="text" />
   <input name="password" type="password" />
   <input name="continue" type="submit" value="Login" />
   <input name="continue" type="button" value="Clear" />
  </form>
</body>
<html>

Element user name & password có thể được xác định như sau:

username = driver.find_element_by_name('username')
password = driver.find_element_by_name('password')

Câu lệnh này sẽ cung cấp "Login" button trước "Clear" button

continue = driver.find_element_by_name('continue')

3. Locating by XPath

XPath là một ngôn ngữ sử dụng cho việc định vị nodes trong tài liệu XML. Như HTML có thể là một thực hiện của XML (XHTML), Người sử dụng Selenium có thể tận dụng ngôn ngữ lớn mạnh này để nhắm mục tiêu các elements trong ứng dụng web của họ. Mở rộng XPath (Sự hỗ trợ tốt)các phương thức đơn giản xác định bởi id hoặc tên thuộc tính phát triển tính năng mới như là xác định ba checkbox trên một page.

Một trong những lý do cho việc sử dụng XPath là khi bạn có một id phù hợp hoặc tên thuộc tính cho element bạn muốn xác định, bạn cần sử dụng Xpath để xác định element đó trong điều kiện tuyệt đối, hoặc liên quan tới một element có id hoặc tên thuộc tính. Xpath locators có thể cũng được sử dụng để xác định elements thông qua thuộc tính khác hơn là thông qua id và tên.

XPath Absolute chứa vị trí của tất cả các yếu tố từ gốc (html). Bằng việc tìm một element gần nhất với một id hoặc tên thuộc tính bạn có thể xác định element dựa trên mối quan hệ. Điều này rất hiếm khi thay đổi và có thể tạo ra nhiều kiểm thử mạnh mẽ hơn.

<html>
 <body>
  <form id="loginForm">
   <input name="username" type="text" />
   <input name="password" type="password" />
   <input name="continue" type="submit" value="Login" />
   <input name="continue" type="button" value="Clear" />
  </form>
</body>
<html>

Element có thể được xác định như sau:

login_form = driver.find_element_by_xpath("/html/body/form[1]")
login_form = driver.find_element_by_xpath("//form[1]")
login_form = driver.find_element_by_xpath("//form[@id='loginForm']")

username element có thể được xác định như sau:

username = driver.find_element_by_xpath("//form[input/@name='username']")
username = driver.find_element_by_xpath("//form[@id='loginForm']/input[1]")
username = driver.find_element_by_xpath("//input[@name='username']")

“Clear” button element có thể được xác định như sau:

clear_button = driver.find_element_by_xpath("//input[@name='continue'][@type='button']")
clear_button = driver.find_element_by_xpath("//form[@id='loginForm']/input[4]")

3. Locating Hyperlinks by Link Text

Locating Hyperlinks sử dụng khi bạn biết link text được sử dụng. Với strategy này element đầu tiên khớp với link text thì location sẽ được trả lại. Nếu không có element nào khớp với link text thì NoSuchElementException sẽ được hiển thị.

<html>
 <body>
  <p>Are you sure you want to do this?</p>
  <a href="continue.html">Continue</a>
  <a href="cancel.html">Cancel</a>
</body>
<html>

continue.html link có thể được xác định

continue_link = driver.find_element_by_link_text('Continue')
continue_link = driver.find_element_by_partial_link_text('Conti')

4. Locating Elements by Tag Name

Sử dụng Locating Elements by Tag Name để xác định một element bởi tag name. Với strategy này Element đầu tiên cung cấp tag name sẽ được trả lại, nếu không có element nào khớp với tag name thì NoSuchElementException sẽ được hiển thị.

<html>
 <body>
  <h1>Welcome</h1>
  <p>Site content goes here.</p>
</body>
<html>

The heading (h1) element có thể được xác định như sau:

heading1 = driver.find_element_by_tag_name('h1')

5. Locating Elements by Class Name

Locating Elements by Class Name được sử dụng khi bạn muốn xác định element bởi tên thuộc tính. Với strategy này, element đầu tiên khớp với Class name sẽ được trả lại. Nếu không có element khớp với tên thuộc tính thì NoSuchElementException sẽ được hiển thị.

<html>
 <body>
  <p class="content">Site content goes here.</p>
</body>
<html>

The “p” element có thể xác định như sau:

content = driver.find_element_by_class_name('content')

6. Locating Elements by CSS Selectors

Locating Elements by CSS Selectors sử dụng khi bạn muốn xác định một element bởi CSS. Với strategy này Element đầu tiên khớp với CSS sẽ được trả lại. Nếu không có element nào khớp với CSS thì NoSuchElementException sẽ được hiển thị.

<html>
 <body>
  <p class="content">Site content goes here.</p>
</body>
<html>

“p” element có thể xác định như dưới đây:

content = driver.find_element_by_css_selector('p.content')

7. Waits

Ngày nay hầu hết web apps đều sử dụng kỹ thuật AJAX khi một trang được nạp vào trình duyệt, các elements trong page đó có thể tải lại ở các khoảng thời gian khác nhau. Điều này tạo nên việc xác định các element khó khăn, nếu element không có mặt trong DOM nó sẽ hiển thị ElementNotVisibleException exception. Bằng cách Sử dụng waits, chúng ta có thể làm sáng tỏ vấn đề này.

Waiting cung cấp một số khoảng thời gian giữa các hành động thực hiện - chủ yếu là xác định element hoặc bất kỳ hoạt động nào khác với element. Selenium Webdriver cung cấp 2 loại của Waits đó là implicit & explicit.

Một explicit wait làm cho WebDriver đợi một điều kiện chắc chắn xảy ra trước khi thực hiện hành động khác.

Một implicit wait làm cho WebDriver thăm dò DOM để chắc chắn về lượng thời gian khi cố gắng xác định một element.

8. Explicit Waits

Một Explixit wait là code để bạn xác định đợi một điều kiện chắc chắn xảy ra trước khi diễn ra hành động khác trong code. Trường hợp xấu nhất của trường hợp này là xảy ra time.sleep (), trong đó Explixit wait sẽ đặt ra một khoảng thời gian chính xác để chờ đợi. Một số phương pháp thuận lợi giúp bạn viết code chờ chỉ khi cần thiết đó chính là WebDriverWait kết hợp với ExpectedCondition là một trong những cách có thể thực hiện điều này.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")
try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "myDynamicElement"))
    )
finally:
    driver.quit()

Câu Lệnh trên đợi 10s trước khi xảy ra TimeoutException hoặc tìm element sẽ trả lại trong vòng 0-10s. WebDriverWait mặc định gọi expectedCondition tất cả là 500ms cho đến khi nó được return thành công.

Expected Conditions

Selenium Python binding cung cấp một số phương thức thuận lợi do đó bạn không cần phải code một lớp expected_condition hoặc tạo ra các gói tiện ích của riêng bạn. Dưới đây là một số conditions thường xảy ra khi thực hiện tự động hóa chương trình trên trình duyệt web

  • title_is
  • title_contains
  • presence_of_element_located
  • visibility_of_element_located
  • visibility_of
  • presence_of_all_elements_located
  • text_to_be_present_in_element
  • text_to_be_present_in_element_value
  • frame_to_be_available_and_switch_to_it
  • invisibility_of_element_located
  • element_to_be_clickable - it is Displayed and Enabled.
  • staleness_of
  • element_to_be_selected
  • element_located_to_be_selected
  • element_selection_state_to_be
  • element_located_selection_state_to_be
  • alert_is_present
from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(driver, 10)
element = wait.until(EC.element_to_be_clickable((By.ID,'someid')))

Các mô-đun expected_conditions chứa một tập hợp các điều kiện được xác định trước để sử dụng với WebDriverWait.

9. Implicit Waits

Một implicit wait nói cho WebDriver để thăm dò DOM chắc chắn lượng thời gian khi cố tìm một element hoặc nhiều elements ko có sẵn ngay lập tức. Mặc định setting là 0. Một khi được thiết lập thì implicit wait được thiết lập cho vòng đời WebDriver.

from selenium import webdriver

driver = webdriver.Firefox()
driver.implicitly_wait(10) # seconds
driver.get("http://somedomain/url_that_delays_loading")
myDynamicElement = driver.find_element_by_id("myDynamicElement")

All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí