webbase.py:

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException


class WebBase:
    def __init__(self, driver):
        self.driver = driver
    def get_url(self,url):
        self.driver.get(url)
        self.driver.maximize_window()
    def find_element(self,locator):
        try:
            if isinstance(locator, list):
                locator = tuple(locator)
            if not isinstance (locator, tuple):
                print("参数错误")
            print("正在定位元素信息:定位方式->%s,value值->%s" % (locator[0],locator[1]))
            ele = WebDriverWait(self.driver, 10,0.5).until(EC.presence_of_element_located(locator))
            print("元素定位{}成功".format(locator))
            return ele
        except TimeoutException as e:
            print('未定位到元素',locator)
            raise e
    def sendkeys(self,locator,text):
       ele =  self.find_element(locator)
       ele.send_keys(text)
       print("{}".format(text))
    def click(self,locator):
        ele = self.find_element(locator)
        ele.click()
        print("{}".format(locator))

homePage.py:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from BasePage.webbase import WebBase
import time
class HomePage(WebBase):

    loc_input = ["id","chat-textarea"]
    loc_button = ["id","chat-submit-button"]
    loc_news = ['xpath','//a[contains(text(),"新闻")]']

    def __init__(self, driver):
        super().__init__(driver)
        self.get_url('https://www.baidu.com/')

    def search_info(self,text):
        self.sendkeys(self.loc_input,text)
        self.click(self.loc_button)
    def goto_news(self):
        self.click(self.loc_news)


if __name__ == '__main__':
    driver = webdriver.Chrome(service=Service('/usr/local/bin/chromedriver'))
    homePage = HomePage(driver)
    # homePage.search_info("Python")
    homePage.goto_news()
    time.sleep(300)

test_baidu_case.py:

import pytest
from PageObject.homePage import HomePage
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from BasePage.webbase import WebBase
import time
driver = webdriver.Chrome(service=Service('/usr/local/bin/chromedriver'))
class TestCase():
    def test_baidu_case01(self):
        '''查询功能'''
        home = HomePage(driver)
        home.search_info("cppppp")
    def test_baidu_case02(self):
        '''跳转新闻页'''
        home = HomePage(driver)
        home.goto_news()

1.基础层(Base / Driver & Web 封装)

文件:webbase.py

作用:
提供浏览器与元素操作的最小“积木”:打开页面、显式等待、找元素、点/输。所有页面对象继承它,避免在用例里写底层 Selenium 代码。

2.逻辑层(Page Object / 页面动作封装)

文件:homePage.py(继承 WebBase)

作用:
把“页面元素 + 页面动作”封装成类方法:页面逻辑(而不是业务流程)。测试/业务层只调用这些方法。

3.业务层(Test / 用例与业务流程编排)

文件:test_baidu_case.py(pytest 用例)

作用:
组合页面动作形成业务流程:例如“搜索”“跳转新闻页”。断言/数据驱动也在这一层。