前面写了很多篇的pytest文章,始终没有小实战,本章就来一起浅试一下。
selenium==4.7
python==3.9.13
pytest==7.1.3
前后置
from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from time import sleep class Test_browser: def setup_method(self): s = Service(r'E:\selenium_test\lib\geckodriver.exe') self.driver = webdriver.Firefox(service=s) def test_start_browser(self): self.driver.get("https://www.baidu.com") self.driver.find_element(By.ID,'kw').send_keys('拾|贰') sleep(1) def test_new_start_browser(self): self.driver.get('https://mp.weixin.qq.com/mp/homepage?__biz=MzkwODI1OTYwMg==&hid=9&sn=3bcfe7970477ab4fd454dfa0011c9245') sleep(1) def teardown_method(self): self.driver.quit()
setup_method以及teardown_method每个方法都执行一次浏览器打开的动作,如果想不论多少条用例都是只打开一次浏览器。将方法切换成setup_class以及teardown_class即可。
「这是最为基础的部分,如果还是不懂,需要回头好好学习学习了」
fixture
「conftest.py」文件
import pytest from selenium import webdriver from selenium.webdriver.chrome.service import Service @pytest.fixture(scope='session') def browser(): s = Service(r'D:\pytest_\Case\geckodriver.exe') driver = webdriver.Firefox(service=s) print("*_*准备启动浏览器!!!") yield driver driver.quit()
这样写可以传递driver示例对象也能便捷的启动与关闭浏览器。
「test.py」文件
def test_start_browser(browser): browser.get("https://www.baidu.com")
你会发现这样也能启动浏览器。除了启动浏览器,还能进行元素定位操作。
from selenium.webdriver.common.by import By from time import sleep def test_start_browser(browser): browser.get("https://www.baidu.com") browser.find_element(By.ID,'kw').send_keys('拾|贰') sleep(1)
fixture的妙用之一,你领会了吗?
「当然,fixture不一定需要写到conftest.py文件中,也能直接写在普通的测试文件中。」
import pytest from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from time import sleep @pytest.fixture(scope='session') def browser(): s = Service(r'E:\selenium_test\lib\geckodriver.exe') driver = webdriver.Firefox(service=s) yield driver driver.quit() class Test_browser: def test_start_browser(self,browser): browser.get("https://www.baidu.com") browser.find_element(By.ID,'kw').send_keys('拾|贰') sleep(1) def test_new_start_browser(self,browser): browser.get('https://mp.weixin.qq.com/mp/homepage?__biz=MzkwODI1OTYwMg==&hid=9&sn=3bcfe7970477ab4fd454dfa0011c9245') sleep(1)
如上都是fixture的部分用法。你熟悉了吗?
fixture参数化
import pytest from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from time import sleep @pytest.fixture(scope='session') def browser(): s = Service(r'E:\selenium_test\lib\geckodriver.exe') driver = webdriver.Firefox(service=s) yield driver driver.quit() @pytest.fixture(params=['qingan','qinganan']) def user(request): return request.param @pytest.fixture(params=['123456','qingan']) def pwd(request): return request.param class Test_browser: def test_start_browser(self,browser): browser.get("https://d2.shopxo.vip/login.html") def test_new_start_browser(self,browser,user,pwd): browser.find_element(By.NAME, 'accounts').send_keys(user) browser.find_element(By.NAME,'pwd').send_keys(pwd) sleep(1) browser.find_element(By.CLASS_NAME,'am-btn.am-btn-primary.am-btn-block.am-radius.am-btn-sm.btn-loading-example').click() sleep(2) browser.find_element(By.NAME, 'accounts').clear() browser.find_element(By.NAME, 'pwd').clear() text = browser.find_element(By.XPATH, '//*[text()="密码格式6~18个字符"]').text assert text == '密码格式6~18个字符' sleep(2)
这是简单的运用,当然,这样的方式存在一定的缺陷,但是依旧不影响举一反三的使用。
缺陷一:登录成功后无法退出。所以fixture的范围需要变动。
缺陷二:断言不够全面,需要根据实际情况来断言对应的值。
缺陷三:参数化这样的方式存在一定的缺陷,它会给你一套组合拳。打乱原本的参数化数据。