[TOC]css
官網地址:https://www.python.org/downloads/html
- 不要用python2.7,請堅決果斷的選擇python3。
- 安裝時,記得勾選上"Add Python to Path" 選項。
- 安裝後,在命令窗口中,輸入"python -v", 檢查是否python3安裝成功,版本是否正確。
pip install selenium
若是安裝出現超時的狀況,能夠換上其它源。node
pip install selenium-i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
安裝後, 執行'pip list'命令, 列出全部安裝了的包.python
pip list
下載與你的chrome對應版本的chrome driver。 (下載地址: https://npm.taobao.org/mirrors/chromedriver/)
每一個版本的文件夾中,帶有一個note文件,能夠用來查看適用的chrome版本。web
demo.pychrome
#coding=utf-8 from selenium import webdriver chrome_driver = 'C:\Users\L\AppData\Local\Google\Chrome\Application\chromedriver.exe' #chrome_driver 存放位置 driver = webdriver.Chrome(executable_path=chrome_driver) driver.get("https://www.baidu.com/") driver.find_element(By.ID, "kw").send_keys("demo") driver.find_element(By.ID, "su").click() driver.quit()
執行腳本:npm
python demo.py
若是沒有配置webdriver的環境變量而致使selenium找不到driver報錯。也可經過在代碼中設置webdriver的位置,來解決這個問題。json
用Selenium IDE插件,即便不會selenium語句也能夠快速寫好腳本。
步驟:session
# Generated by Selenium IDE import pytest import time import json from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.support import expected_conditions from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.desired_capabilities import DesiredCapabilities class TestDemotest(): def setup_method(self, method): self.driver = webdriver.Chrome() self.vars = {} def teardown_method(self, method): self.driver.quit() def test_demotest(self): # Test name: demo_test # Step # | name | target | value | comment # 1 | open | / | | self.driver.get("https://www.baidu.com/") # 2 | type | id=kw | demo | self.driver.find_element(By.ID, "kw").send_keys("demo") # 3 | click | id=su | | self.driver.find_element(By.ID, "su").click()
在使用selenium IDE導出的文件中,能夠看到使用了pytest包。它是 python 的第三方單元測試框架。併發
pip install pytest -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
pip install -U pytest-html -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
pytest demo.py --html=test_report.html
pip install xlrd -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
ExcelHandler.py
import xlrd from settings import conf class ExcelHandler(object): def get_excel_data(self): # 獲取到book對象 book = xlrd.open_workbook(conf.TEST_CASE_PATH) # 獲取sheet對象 sheet = book.sheet_by_index(0) rows, cols = sheet.nrows, sheet.ncols l = [] title = sheet.row_values(0) title.insert(0, 'i') for i in range(1, rows): values = sheet.row_values(i) values.insert(0, i) l.append(dict(zip(title, values))) return l
demo.py
增長 @pytest.mark.parametrize,使測試用例參數化
from uti.ExcelHandler import ExcelHandler ... @pytest.mark.parametrize('case', ExcelHandler().get_excel_data) def test_demotest(self): print(case['T1']) ...
當excel中包含了n條的記錄,則測試用例執行n次
加入一個測試用例執行時間爲10秒,那麼若是excel中包含了60條記錄,那麼就要執行10分鐘。 可是若是有10個進程同時執行這60個測試用例,那麼執行時間就能夠大大縮短。 因此這裏引入了分佈式運行用例插件pytest-xdist
pip install pytest-xdist
pytest -n 10 demo.py --html=test_report.html
# coding=utf-8 import pytest import time import json import os from selenium import webdriver from selenium.webdriver.chrome.options import Options driver = None @pytest.mark.hookwrapper def pytest_runtest_makereport(item): pytest_html = item.config.pluginmanager.getplugin('html') outcome = yield report = outcome.get_result() extra = getattr(report, 'extra', []) if report.when == 'call' or report.when == "setup": xfail = hasattr(report, 'wasxfail') if (report.skipped and xfail) or (report.failed and not xfail): dirpng = r'./report/png/' file_name = dirpng + report.nodeid.replace("::", "_") + ".png" file_path = os.path.split(file_name)[0] + '/' if os.path.exists(file_path) and os.path.isdir(file_path): pass else: os.makedirs(file_path) file_name_in_report = r'./png/'+ report.nodeid.replace("::", "_")+".png" _capture_screenshot(file_name) if file_name: html = '<div><img src="%s" alt="screenshot" style="width:304px;height:228px;" ' \ 'onclick="window.open(this.src)" align="right"/></div>' % file_name_in_report extra.append(pytest_html.extras.html(html)) report.extra = extra def _capture_screenshot(name): driver.get_screenshot_as_file(name) @pytest.fixture(scope='session', autouse=True) def browser(): global driver if driver is None: chrome_driver = r'C:\Users\L\AppData\Local\Google\Chrome\Application\chromedriver.exe' #chrome_driver 存放位置 chrome_options = Options() chrome_options.add_argument('headless') driver = webdriver.Chrome(executable_path=chrome_driver, options=chrome_options) return driver
能夠。報告中會生成已經執行好的測試用例的結果。
pytest --lf demo.py --html=test_report_fail.html
加上-s參數。pytest -s demo.py --html=test_report.html
參考: pytest -- 捕獲標準輸出和標準錯誤輸出
在代碼中加入sys.stdout = sys.stderr. 這樣執行後雖然控制檯中顯示了,可是report中,打印信息又再也不顯示 能夠考慮在將print換成logging插件打印出log.
pytest --html=report.html --self-contained-html