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