美文网首页
49. Page Object模式 - 1基于test_baid

49. Page Object模式 - 1基于test_baid

作者: 薛东弗斯 | 来源:发表于2024-03-24 06:17 被阅读0次
    project > test_po > conftest.py
    project > test_po > test_baidu.py
    
    # project > test_po > conftest.py
    import allure
    import pytest
    from selenium import webdriver
    
    @pytest.fixture(scope="session")
    def driver():
        driver = webdriver.Chrome()
        driver.maximize_window()
        print("打开浏览器")
        yield driver
        print("关闭浏览器")
        driver.close()
        driver.quit()
    
    @pytest.fixture()
    def fixture():
        print("我是前置步骤")
        yield "XXX"
        print("我是后置步骤")
    
    # baidu网页,登录与未登录,两种场景各不相同。
    from selenium.webdriver.common.by import By
    
    class TestBaidu:
        def test_baidu1(self, driver):
            #未登录测试
            driver.get("https://www.baidu.com/")
            title = driver.title
            url = driver.current_url
            text = driver.find_element(By.CSS_SELECTOR, 'a[href="http://news.baidu.com"]').text
            button_text = driver.find_element(By.ID, 'su').accessible_name
            assert title == "百度一下,你就知道"
            assert url == "https://www.baidu.com/"
            assert text == "新闻"
            assert button_text == "百度一下"
    
        def test_baidu2(self, driver):
            # 登录测试
            driver.get("https://www.baidu.com/")
            title = driver.title
            url = driver.current_url
            text = driver.find_element(By.CSS_SELECTOR, 'a[href="http://news.baidu.com"]').text
            button_text = driver.find_element(By.ID, 'su').accessible_name
            assert title == "百度一下,你就知道"
            assert url == "https://www.baidu.com/"
            assert text == "新闻"
            assert button_text == "百度一下"
    

    CSS的五种定位方式 (baidu.com)
    selenium 用By定位元素 - 知乎 (zhihu.com)

    image.png
    image.png

    上面案例,如果访问网页发生变化,则后续所有case都会fail,如何维护?

    # Page Object解决什么问题
    可以解决元素定位改变带来的维护成本的增加
    元素定位与用例分离
    代码冗余
    
    是不是可以把网页提取为一个公用的东西?如果定位链接发生改变,只需要在一个地方更改即可
    news = (By.CSS_SELECTOR, 'a[href="http://news.baidu.com"]')
    button = (By.ID, 'su') 
    这两句放到类下面的公共部分,让类里面的每个函数去调用。调用的使用用  类.方法
    如 TestBaidu.su
    为了避免数据类型等不明报错,在类名前面需要加*, * 执行元组解包的动作,则可执行通过
    
    a=(1,2)
    print(a)
    > (1, 2)
    print(*a)
    > 1 2
    
    from selenium.webdriver.common.by import By
    
    
    class TestBaidu:
        news = (By.CSS_SELECTOR, 'a[href="http://news.baidu.com"]')
        button = (By.ID, 'su')
        def test_baidu1(self, driver):
            #未登录测试
            driver.get("https://www.baidu.com/")
            title = driver.title
            url = driver.current_url
            text = driver.find_element(*TestBaidu.news).text
            button_text = driver.find_element(*TestBaidu.button).accessible_name
            assert title == "百度一下,你就知道"
            assert url == "https://www.baidu.com/"
            assert text == "新闻"
            assert button_text == "百度一下"
    
        def test_baidu2(self, driver):
            # 登录测试
            driver.get("https://www.baidu.com/")
            title = driver.title
            url = driver.current_url
            text = driver.find_element(*TestBaidu.news).text
            button_text = driver.find_element(*TestBaidu.button).accessible_name
            assert title == "百度一下,你就知道"
            assert url == "https://www.baidu.com/"
            assert text == "新闻"
            assert button_text == "百度一下"
    

    相关文章

      网友评论

          本文标题:49. Page Object模式 - 1基于test_baid

          本文链接:https://www.haomeiwen.com/subject/jrozzdtx.html