12/08/2018, 14:27

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

Ở bài viết trước đã trình bày một số thuộc tính Selenium Python như: Locating by ID, Locating by Name, Locating by XPath, Locating Hyperlinks by Link Text, Locating Elements by Tag Name, Locating Elements by Class Name, Locating Elements by CSS Selectors, Waits, Explicit Waits, Explicit Waits thông ...

Ở bài viết trước đã trình bày một số thuộc tính Selenium Python như: Locating by ID, Locating by Name, Locating by XPath, Locating Hyperlinks by Link Text, Locating Elements by Tag Name, Locating Elements by Class Name, Locating Elements by CSS Selectors, Waits, Explicit Waits, Explicit Waits thông qua bài viết

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

Ở bài viết này sẽ tiếp tục với một số thuộc tính khác của Selenium Python

1. Page Objects

Một page object trình bày giao diện bạn đang tương tác trong web application

Thuận lợi khi sử dụng page objects:

  • Tạo code tái sử dụng có thể chia sẻ thông qua nhiều test case
  • Giảm số lượng code trùng lặp
  • Nếu giao diện bị thay đổi thì việc fix chỉ cần thay đổi ở một nơi duy nhất

1.1. Test case

Dưới đây là một test case tìm kiếm cho một từ trong python.org website và đảm bảo một số kết quả được tìm thấy

import unittest
from selenium import webdriver
import page

class PythonOrgSearch(unittest.TestCase):
    """A sample test class to show how page object works"""

    def setUp(self):
        self.driver = webdriver.Firefox()
        self.driver.get("http://www.python.org")

    def test_search_in_python_org(self):
        """
        Tests python.org search feature. Searches for the word "pycon" then verified that some results show up.
        Note that it does not look for any particular text in search results page. This test verifies that
        the results were not empty.
        """

        #Load the main page. In this case the home page of Python.org.
        main_page = page.MainPage(self.driver)
        #Checks if the word "Python" is in title
        assert main_page.is_title_matches(), "python.org title doesn't match."
        #Sets the text of search textbox to "pycon"
        main_page.search_text_element = "pycon"
        main_page.click_go_button()
        search_results_page = page.SearchResultsPage(self.driver)
        #Verifies that the results page is not empty
            assert search_results_page.is_results_found(), "No results found."

    def tearDown(self):
        self.driver.close()

if __name__ == "__main__":
    unittest.main()

1.2. Page object classes

Page object pattern dành cho việc tạo một đối tượng cho mỗi web page bằng cách làm theo kĩ thuật tách lớp giữa test code và thực hiện kĩ thuật được tạo

page.py sẽ như sau:

from element import BasePageElement
from locators import MainPageLocators

class SearchTextElement(BasePageElement):
    """This class gets the search text from the specified locator"""

    #The locator for search box where search string is entered
    locator = 'q'

class BasePage(object):
    """Base class to initialize the base page that will be called from all pages"""

    def __init__(self, driver):
        self.driver = driver

class MainPage(BasePage):
    """Home page action methods come here. I.e. Python.org"""

    #Declares a variable that will contain the retrieved text
    search_text_element = SearchTextElement()

    def is_title_matches(self):
        """Verifies that the hardcoded text "Python" appears in page title"""
        return "Python" in self.driver.title

    def click_go_button(self):
        """Triggers the search"""
        element = self.driver.find_element(*MainPageLocators.GO_BUTTON)
        element.click()

class SearchResultsPage(BasePage):
    """Search results page action methods come here"""

    def is_results_found(self):
        # Probably should search for this text in the specific page
        # element, but as for now it works fine
        return "No results found." not in self.driver.page_source

1.3. Page elements

element.py sẽ như sau:

from selenium.webdriver.support.ui import WebDriverWait

class BasePageElement(object):
    """Base page class that is initialized on every page object class."""

    def __set__(self, obj, value):
        """Sets the text to the value supplied"""
        driver = obj.driver
        WebDriverWait(driver, 100).until(
            lambda driver: driver.find_element_by_name(self.locator))
        driver.find_element_by_name(self.locator).send_keys(value)

    def __get__(self, obj, owner):
        """Gets the text of the specified object"""
        driver = obj.driver
        WebDriverWait(driver, 100).until(
            lambda driver: driver.find_element_by_name(self.locator))
        element = driver.find_element_by_name(self.locator)
        return element.get_attribute("value")

1.4. Locators

Đây là một trong những ví dụ để tách chuỗi locator từ nơi đang đượ sử dụng. Trong ví dụ này locators của cùng một trang thuộc về cùng một lớp.

locators.py sẽ như sau:

from selenium.webdriver.common.by import By

class MainPageLocators(object):
    """A class for main page locators. All main page locators should come here"""
    GO_BUTTON = (By.ID, 'submit')

class SearchResultsPageLocators(object):
    """A class for search results locators. All search results locators should come here"""
    pass

2. WebDriver API

Ở phần này bao gồm tất cả giao diện của Selenium WebDriver

Gợi ý Import Style:

Định nghĩa API trong chương này cho thây vị trí xác thực của lớp. Tuy nhiên gợi ý import style được cung cấp như sau:

from selenium import webdriver

Sau đó bạn có thể truy cập class như sau:

webdriver.Firefox
webdriver.FirefoxProfile
webdriver.Chrome
webdriver.ChromeOptions
webdriver.Ie
webdriver.Opera
webdriver.PhantomJS
webdriver.Remote
webdriver.DesiredCapabilities
webdriver.ActionChains
webdriver.TouchActions
webdriver.Proxy

Khóa chính class keys có thể được import như sau:

from selenium.webdriver.common.keys import Keys

Exception classes có thể được import như là (Thay thế `TheNameOfTheExceptionClass với tên class hiện tại được cung cấp như dưới):

from selenium.common.exceptions import [TheNameOfTheExceptionClass]

Conventions sử dụng trong API

Một số thuộc tính hoặc phương thức có thể được gọi tới thì kết thúc với dấu ngoặc tròn

Một số property không được gọi tới thì không kết thúc bằng dấu ngoặc tròn

Đây là ví dụ cho property

current_url

URL của page hiện tại sử dụng:

driver.current_url

Đây là ví dụ cho method

• close()

Close cửa sổ hiện tại sử dụng:

driver.close()

3. Alerts

Alert được sử dụng như dưới đây

classselenium.webdriver.common.alert.Alert(driver)

Sử dụng class này để tương tác với alert cảnh báo, nó chứa các phương thức cho dismissing, accepting, inputting và lấy text lên

Accepting / Dismissing alert như sau:

Alert(driver).accept()
Alert(driver).dismiss()

Input một giá trị trong alert

name_prompt = Alert(driver) name_prompt.send_keys(“Willian Shakesphere”) name_prompt.accept()

Đọc một text từ cảnh báo như dưới:

alert_text = Alert(driver).text self.assertEqual(“Do you wish to quit?”, alert_text)

Chấp nhận Alert có sẵn như sau:

Usage:: Alert(driver).accept() # Confirm a alert dialog.

Gửi username/password tới một Authenticated dialog (như với Basic HTTP Auth) sử dụng:

Usage:: driver.switch_to.alert.authenticate(‘cheese’, ‘secretGouda’)

Nguồn tham khảo

http://selenium-python.readthedocs.io/api.html

0