selenium+pytest相关习题

一、pytest夹具

@pytest.fixture
def driver():
    d = webdriver.Chrome(service=Service('./chromedriver.exe'))
    yield d   # 这个d会传给测试函数
    d.quit()  # 测试结束后自动执行

二、相关习题(附注:pytest用例函数名必须test_开头)

任务1:打开bilibili,搜索“地球”(30分钟)

启动Chrome,打开https://www.bilibili.com。

用 find_element 定位到搜索框,输入“地球”。

定位搜索按钮,点击。

def test_bilibili_serch(driver):
    driver.get('https://www.bilibili.com/')
    wait = WebDriverWait(driver, 10)
    wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="nav-searchform"]/div[1]/input'))).send_keys('地球')
    driver.find_element(By.XPATH, '//*[@id="nav-searchform"]/div[2]').click()
    driver2 = driver.window_handles
    driver.switch_to.window(driver2[1])
    assert '地球' in driver.title

任务2:登录一个测试网站(45分钟)

推荐练习站: 搜“Selenium 练习网站”或直接用 https://practicetestautomation.com/practice-test-login/ (一个专门用来练登录的)。

定位用户名框、密码框、登录按钮,执行登录。

登录成功后,找到页面上的“Log out”按钮或某个成功提示文本,打印出来。

在这里你会遇到等待的痛点:登录按钮点了之后,页面会跳转,如果你不等,下一个元素就找不到。试着用显式等待解决。

def test_login(driver):
    driver.get('https://practicetestautomation.com/practice-test-login/')
    driver.find_element(By.ID, 'username').send_keys('student')
    driver.find_element(By.ID, 'password').send_keys('Password123')
    driver.find_element(By.ID, 'submit').click()
    wait = WebDriverWait(driver, 5)
    text = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="loop-container"]/div/article/div[2]/div/div/div/a'))).text
    assert text == 'Log out'
    print(text)

任务3:带数据驱动的登录测试(升级,90分钟)

推荐练习站: 搜“Selenium 练习网站”或直接用 https://practicetestautomation.com/practice-test-login/ (一个专门用来练登录的)

创建一个CSV或Excel文件,里面有多组用户名和密码(包括正确的和错误的)。

写一个循环,从文件里读取每组数据,执行登录,然后根据预期结果(成功或失败)判断测试是否通过,并用Python的print输出结果。

这是你简历上第一个“自动化测试框架”的雏形,非常重要。

def get_data_from_excel(file_path):
    wb = openpyxl.load_workbook(file_path)
    sheet = wb.active
    data = []
    for row in sheet.iter_rows(min_row=2, values_only=True):
        data.append(row)
    return data

def login_test(driver, username, password):
    WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.ID, 'username'))).send_keys(username)
    driver.find_element(By.ID, 'password').send_keys(password)
    driver.find_element(By.ID, 'submit').click()
    try:
        WebDriverWait(driver,5).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="loop-container"]/div/article/div[2]/div/div/div/a')))
    except TimeoutException:
        return '登录失败'
    else:
        return '登录成功'

@pytest.mark.parametrize("username, password, result", get_data_from_excel('./testdata_pytest.xlsx'))
def test_login(driver, username, password, result):
    driver.get('https://practicetestautomation.com/practice-test-login/')
    login_success = login_test(driver, username, password)
    assert login_success == result

任务4(选做,进阶):使用Page Object模式重构

把任务3转换成Page Object 设计模式。很简单,就是把“一个页面的所有元素定位和操作”封装成一个类,
测试脚本只调用类的方法,看起来特别清晰易维护。

这个模式你只要在面试中能讲出它的好处,就能秒杀很多竞争者:
好维护‌:页面元素变了,只用改对应的页面对象类,不用改所有测试用例 。
‌能复用‌:同一个页面的操作方法可以被多个测试用例重复调用,减少重复代码 。
‌看得懂‌:测试用例里全是业务语言,不像以前那样夹杂大量技术代码,逻辑更清晰

class PageLogin:
    #页面网址
    URL = 'https://practicetestautomation.com/practice-test-login/'

    #元素定位器
    USERNAME_INPUT = (By.ID, 'username')
    PASSWORD_INPUT = (By.ID, 'password')
    LOGIN_CLICK = (By.ID, 'submit')
    SUCCESS_FLAG = (By.XPATH, '//*[@id="loop-container"]/div/article/div[2]/div/div/div/a')

    #初始化driver
    def __init__(self, driver):
        self.driver = driver

    #进入网站
    def open(self):
        self.driver.get(self.URL)
    #输入账户
    def username_enter(self, username):
        WebDriverWait(self.driver, 5).until(EC.element_to_be_clickable(self.USERNAME_INPUT)).send_keys(username)

    #输入密码
    def password_enter(self, password):
        self.driver.find_element(*self.PASSWORD_INPUT).send_keys(password)

    #点击登录按钮
    def login_click(self):
        self.driver.find_element(*self.LOGIN_CLICK).click()


    #登录
    def login_test(self,username, password):
        self.username_enter(username)
        self.password_enter(password)
        self.login_click()
        try:
            WebDriverWait(self.driver, 5).until(EC.element_to_be_clickable(self.SUCCESS_FLAG))
        except TimeoutException:
            return '登录失败'
        else:
            return '登录成功'


def get_data_from_excel(file_path):
    wb = openpyxl.load_workbook(file_path)
    sheet = wb.active
    data = []
    for row in sheet.iter_rows(min_row=2, values_only=True):
        data.append(row)
    return data

@pytest.mark.parametrize("username, password, result", get_data_from_excel('./testdata_pytest.xlsx'))
def test_login(driver, username, password, result):
    pagelogin = PageLogin(driver)
    pagelogin.open()
    is_login_success = pagelogin.login_test(username, password)
    assert is_login_success == result

三、pytest测试用例执行

1)执行命令:

        pytest my_pytest.py

2)执行并生成报告命令:

        pytest my_pytest.py --alluredir=./report

3)报告转为html并打开的命令:

        allure serve ./report

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值