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

Thông qua bài viết "Selenium Python Bindings (part1)"(ở link dưới) các bạn đã biết căn bản về Selenium Python

https://viblo.asia/huong.quynh/posts/nwmGyQnMGoW

Python là một ngôn ngữ lập trình bậc cao, thông dịch, hướng đối tượng, đa mục đích và cũng là một ngôn ngữ lập trình động.

Selenium Python bindings cung cấp một API đơn giản để viết functional/acceptance test sử dụng selenium webdriver. Thông qua Selenium Python API bạn có thể truy cập tất cả các chức năng của selenium webdriver một cách trực quan.

1. Navigating

Điều đầu tiên mà bạn muốn làm với WebDriver là điều hướng tới một liên kết. Cách bình thường bạn làm đó là gọi tới phương thức:

driver.get("http://www.google.com")

WebDriver sẽ đợi cho đến khi trang đó load đầy đủ trước khi quay trở lại điều khiển test or script. Nếu trang web của bạn sử dụng quá nhiều AJAX để tải thì WebDriver có thể không biết khi nào page đó được tải thành công. Nếu bạn muốn chắc chắn rằng các trang được tải hết thì bạn phải giành thời gian chờ đợi để load đầy đủ trang.

2. Interacting with the page

Để tương tác với pages hoặc cụ thể hơn là các phần tử HTML trong chính page đó thì đầu tiên chúng ta cần tìm một WebDriver cung cấp một số cách để tìm elements. Ví dụ cách cung cấp một element được định nghĩa như dưới

<input type="text" name="passwd" id="passwd-id" />

Bạn có thể tìm element bằng cách sử dụng:

element = driver.find_element_by_id("passwd-id")
element = driver.find_element_by_name("passwd")
element = driver.find_element_by_xpath("//input[@id='passwd-id']")

Bạn cũng có thể tìm kiếm một liên kết bằng chính văn bản của nó nhưng hãy cẩn thận bởi các text phải được khớp chính xác, bạn cũng nên cẩn thận khi sử dụng XPATH trong WebDriver. Nếu có nhiều hơn một phần tử phù hợp với câu lệnh truy vấn thì chỉ có phần tử đầu tiên mới được gửi trả, Nếu không có gì tìm thấy thì một NoSuchElementException sẽ được đưa lên.

WebDriver có một 'Object-based' API; Chúng miêu tả tất cả các loại của elements sử dụng cùng giao diện.

WebDriver sẽ cố gắng thực hiện các câu lệnh đúng, nếu bạn gọi tới một phương thức không có nghĩa (“setSelected()” trên một thẻ "meta" thì sẽ hiển thị exception cho trường hợp này. Vì vậy khi bạn có một element, bạn có thể làm gì với nó? đầu tiên bạn muốn nhập một số text trong text field:

element.send_keys("some text")

Bạn có thể mô phỏng nhấn các phím mũi tên bằng cách sử dụng "Key" class:

element.send_keys(" and some", Keys.ARROW_DOWN)

Bất kỳ element nào cũng có thể gọi tới send_keys để kiểm tra các phím tắt. Một nhược điểm ở đây là trong khi input một số text field không tự động clear thay thế vào đó là những gì bạn input mới sẽ được nối vào các đoạn text đã có sẵn. Bạn có thể dễ dàng xóa nội dung của text field hoặc textarea với phương thức clear như sau:

element.clear()

3.Filling in forms

Chúng ta đã biết làm thế nào để nhập băn bản trong một textarea hoặc text field, nhưng với các elements khác thì như thế nào? bạn có thể chuyển đổi trạng thái của dropdown và bạn có thể sử dụng thẻ "SetSelected" để set một cái gì đó giống như thẻ OPTION đã được chọn.

element = driver.find_element_by_xpath("//select[@name='name']")
all_options = element.find_elements_by_tag_name("option")
for option in all_options:
    print("Value is: %s" % option.get_attribute("value"))
    option.click()

Điều này sẽ tìm thấy phần tử "SELECT" đầu tiên trên page và xoay vòng qua lần lượt từng OPTION in ra giá trị của nó và lựa chọn lần lượt. Lớp hỗ trợ WebDriver 'Select' cung cấp hữu ích phương thức cho việc tương tác:

from selenium.webdriver.support.ui import Select
select = Select(driver.find_element_by_name('name'))
select.select_by_index(index)
select.select_by_visible_text("text")
select.select_by_value(value)

WebDriver cũng cung cấp tính năng cho deselecting tất cả lựa chọn

select = Select(driver.find_element_by_id('id'))
select.deselect_all()

Lệnh trên nhằm mục đích hủy tất cả các items đã được lựa chọn trước đó. Giả sử trong khi test chúng ta cần đưa ra tất cả các lựa chọn mặc định thì cần phải lựa chọn một class cung cấp chính xác các phương thức trả ra 1 list

select = Select(driver.find_element_by_xpath("xpath"))
all_selected_options = select.all_selected_options

Để lấy các tùy chọn có sẵn ta sử dụng:

options = select.options

Khi bạn hoàn thành việc input form và bạn muốn submit. Một cách để làm điều này và tìm 'Submit' button và click vào nó:

driver.find_element_by_id("submit").click()

Ngoài ra WebDriver có phương thức 'Submit' thuận tiện cho tất cả các element. Nếu bạn gọi tới 1 element trong 1 form WebDriver sẽ đi lên DOM cho tới khi nó đóng form và gọi tới submit. Nếu element không phải trong 1 form thì NoSuchElementException sẽ được hiển thị

element.submit()

4. Drag và Drop

Bạn có thể sử dụng Drag và Drop hoặc di chuyển element như sau:

element = driver.find_element_by_name("source")
target = driver.find_element_by_name("target")

from selenium.webdriver import ActionChains
action_chains = ActionChains(driver)
action_chains.drag_and_drop(element, target).perform()

5. Moving between windows and frames

WebDriver hỗ trợ di chuyển giữa các cửa sổ sử dụng phương thức 'switch_to_window'

driver.switch_to_window("windowName")

Làm thế nào để biết tên cửa sổ? quan sát javascript

<a href="somewhere.html" target="windowName">Click here to open a new window</a>

Bạn cũng có thể swing từ frame này tới frame khác

driver.switch_to_frame("frameName")

Bạn có thể truy cập subframes bởi sự phân chia path với một dấu chấm và bạn cũng có thể xác định frame bởi index của nó

driver.switch_to_frame("frameName.0.child")

Sau khi hoàn thành thực hiện trên frames để quay trở lại frame cha ta nên sử dụng

driver.switch_to_default_content()

6. Popup dialog

Selenium WebDriver có xây dựng và hỗ trợ cho việc xử lý hộp thoại popup dialog. Sau khi kích hoạt hành động nó sẽ mở một popip bạn có thể truy cập cảnh báo:

alert = driver.switch_to_alert()

Lệnh trên sẽ thực hiện trả lại cảnh báo hiện tại đang mở. Với đối tượng này bạn có thể chấp nhận, đọc nội dung hoặc thậm chí note vào nhắc nhở. Giao diện công việc là như nhau trên form cảnh báo, xác nhận, nhắc nhở

7. Navigation: history and location

Để điều hướng tới 1 page bạn có thể sử dụng method

 driver.get("http://www.example.com")

Để quay trở lại lịch sử trình duyệt

 driver.forward()
 driver.back()

8. Cookies

Để hiểu sử dụng cookies như nào đầu tiên bạn cần có domain để cookie đc hợp lệ

 # Go to the correct domain
driver.get("http://www.example.com")

# Now set the cookie. This one's valid for the entire domain
cookie = {‘name’ : ‘foo’, ‘value’ : ‘bar’}
driver.add_cookie(cookie)

# And now output all the available cookies for the current URL
driver.get_cookies()

9. Locating Elements

Có rất nhiều phương thức để xác định elements trong 1 page. Bạn có thể sử dụng phương thức nào phù hợp nhất để xác định element. Selenium cung cấp phương thức sau để xác định elements trong 1 page

find_element_by_id

find_element_by_name

find_element_by_xpath

find_element_by_link_text

find_element_by_partial_link_text

find_element_by_tag_name

find_element_by_class_name

find_element_by_css_selector

Để tìm nhiều elements (phương thức này sẽ trả ra một list)

find_elements_by_name

find_elements_by_xpath

find_elements_by_link_text

find_elements_by_partial_link_text

find_elements_by_tag_name

find_elements_by_class_name

find_elements_by_css_selector

Ngoài các phương thức đã nêu ở trên, có 2 phương thức riêng hữu ích với locators trong page đó là 2 phương thức : find_element and find_elements.

Ví dụ

from selenium.webdriver.common.by import By
driver.find_element(By.XPATH, '//button[text()="Some text"]')
driver.find_elements(By.XPATH, '//button')

Đây là thuộc tính có sẵn bởi class

ID = "id"
XPATH = "xpath"
LINK_TEXT = "link text"
PARTIAL_LINK_TEXT = "partial link text"
NAME = "name"
TAG_NAME = "tag name"
CLASS_NAME = "class name"
CSS_SELECTOR = "css selector"

Trên đây là một số thuộc tính của Selenium Python Bindings một số thuộc tính khác sẽ được giới thiệu vào bài viết sau

Nguồn dịch: http://selenium-python.readthedocs.io/locating-elements.html


All Rights Reserved