selnium PageObject (PO)示例

noPO  定位器和方法混在一起;一点web元素修改,全部GG,不够优雅

from selenium import webdriver
from selenium.webdriver.common.by import By


def test_eight_components():
    driver = webdriver.Chrome()
    # 打开百度
    driver.get("https://baidu.com")
    # 从网页获得标题
    title = driver.title   #  百度的title是 '百度一下,你就知道'
    # 断言  将获取的标题和预期标题做对比
    assert title == "百度一下,你就知道"
     # 隐式地等待,直到找到元素  全局设置
    driver.implicitly_wait(0.5)
    #  发送命令 查找元素
    text_box = driver.find_element(by=By.ID, value="kw")
    submit_button = driver.find_element(by=By.ID, value="su")
    #  操作元素
    text_box.send_keys("Selenium") # 在搜索框输入"Selenium"
    submit_button.click()  # 点击发送
    #  搜索前等待0.5秒
    #  获得元素
    message = driver.find_element(by=By.LINK_TEXT, value="百度首页")
    # 变量存储页面获得的值
    value = message.text
    assert value == "百度首页"

    driver.quit()

将定位元素和方法分离;一套定位器,支持多种参数传入;如果页面元素发生更改,仅需要更新定位器;优雅,实在优雅

第一种,没有保护,不包含条件判断 ,不管页面有没有这个元素 都发送请求

from selenium import webdriver
from selenium.webdriver.common.by import By

class BaiduHomePage:
    def __init__(self, driver):
        self.driver = driver
        self.text_box = (By.ID, "kw")
        self.submit_button = (By.ID, "su")
        self.message = (By.LINK_TEXT, "百度首页")

    def enter_search_text(self, text):
        self.driver.find_element(*self.text_box).send_keys(text)

    def click_submit_button(self):
        self.driver.find_element(*self.submit_button).click()

    def get_message_text(self):
        return self.driver.find_element(*self.message).text

    def get_title(self):
        return self.driver.title

def test_eight_components():
    driver = webdriver.Chrome()
    home_page = BaiduHomePage(driver)
    driver.get("https://baidu.com")
    assert home_page.get_title() == "百度一下,你就知道"
    home_page.enter_search_text("Selenium")
    home_page.click_submit_button()
    assert home_page.get_message_text() == "百度首页"
    driver.quit()

 

第二种,比较优雅,有条件保护,如果找不到不交互

 


from selenium import webdriver
from selenium.webdriver.common.by import By
# WebDriverWait是Selenium提供的一个等待工具,
# 它可以用于等待特定条件的出现。
from selenium.webdriver.support.ui import WebDriverWait
# EC是Selenium提供的内置条件类。
from selenium.webdriver.support import expected_conditions as EC
# 使用WebDriverWait和条件方法EC的目的是确保在执行send_keys方法之前,输入框已经可见并且可以与之交互。
# 这样可以避免在输入文本之前出现元素不可见或不可交互的问题。这是一种良好的做法,可以提高测试的稳定性和可靠性。
'''
在这个示例中,我们首先定义了一个名为BaiduHomePage的页面对象类,
它包含了页面中的元素和操作。
第一部分,初始化,init方法用于初始化页面对象类,定义了页面中的元素定位器。

第二部分,写方法,然后我们将测试代码中的操作转移到了BaiduHomePage类中对应的方法中。
在这些方法中,我们使用WebDriverWait类进行元素的等待和定位,并执行相应的操作。

第三部分,实例化调用
在test_eight_components函数中,
我们创建了一个BaiduHomePage类的实例home_page,
并通过该实例执行页面操作,而不是直接使用定位器和WebDriver对象。

通过使用页面对象模型,我们将测试代码中的页面操作抽象成了可重用的方法,
并将元素的定位和等待逻辑封装在页面对象类中。这样做提高了测试代码的可维护性和可读性,
同时也使得当页面发生变化时,只需要修改页面对象类的代码而不是每个测试方法中的代码
'''

class BaiduHomePage:
    def __init__(self, driver): # init初始化  传入驱动参数
        self.driver = driver # 驱动
        self.text_box = (By.ID, "kw") # 输入框的id
        self.submit_button = (By.ID, "su") # 提交按钮的id
        self.message = (By.LINK_TEXT, "百度首页")  # 搜索结果包含的文字

    def enter_search_text(self, text): # 在输入框输入,传入参数 文字
        # 第一
        # WebDriverWait是Selenium提供的一个等待工具,
        # 它可以用于等待特定条件的出现。
        # 在这里,我们使用WebDriverWait来等待self.driver中的元素出现。

        # 第二
        # until(EC.visibility_of_element_located(self.text_box)):这是WebDriverWait的方法,
        # 它将一直等待,直到EC.visibility_of_element_located条件为真(即元素可见)

        # 第二
        # EC是Selenium提供的内置条件类。
        # visibility_of_element_located是一个条件方法,用于检查元素是否可见。
        # 在这里,我们使用visibility_of_element_located来检查self.text_box元素是否可见

        # 第四
        # send_keys(text):这是一个用于向输入框发送文本的方法。在这里,我们将text参数作为文本发送到输入框中
        WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located(self.text_box)).send_keys(text)

    def click_submit_button(self): # 提交按钮
        WebDriverWait(self.driver, 10).until(EC.element_to_be_clickable(self.submit_button)).click()

    def get_message_text(self): # 获得搜索结果包含文字
        return WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located(self.message)).text

    def get_title(self): # 获得页面的标题
        return self.driver.title


def test_eight_components():
    # 调用谷歌浏览器的驱动
    driver = webdriver.Chrome()
    # 实例化一个home_page来调用BaiduHomePage类,传入驱动参数
    home_page = BaiduHomePage(driver)
    # 打开百度
    driver.get("https://baidu.com")
    # 调用实例化的home_page的获得标题方法get_title()  == "百度一下,你就知道"
    assert home_page.get_title() == "百度一下,你就知道"
    # 调用实例化的home_page的输入框输入方法enter_search_text,传入参数 "Selenium"
    home_page.enter_search_text("Selenium")
    # 调用实例化的home_page的点击‘百度一下’方法
    home_page.click_submit_button()
    # 实例化home_page方法的获得搜索结果页面方法get_message_text()  =="百度首页"
    assert home_page.get_message_text() == "百度首页"
    driver.quit()

 

 

 

posted @ 2023-09-25 16:19  胖豆芽  阅读(5)  评论(0编辑  收藏  举报