(翻译)30天学习Python👨💻第二十九天——自动化测试
今天,我通过创建一个基本的自动化测试项目来探索使用 Python 的端到端浏览器自动化测试。
在实现浏览器自动化方面, Selenium 是最流行和使用最广泛的库之一。selenium python 库使它非常容易与python一起使用,并运行脚本在网站上执行自动化测试。
自动化测试对于在真实场景中测试web应用程序至关重要,就像用户通常如何使用应用程序一样。它还用于执行跨浏览器测试,以确保应用程序在所有目标浏览器上工作。
我创建了一个基本项目来理解和实现使用 Selenium 进行浏览器自动化测试的基础知识。
创建项目
我创建了一个新的目录 python-selenium ,并且给这个项目添加了一个虚拟环境。
python -m venv venv
安装 Selenium
下一步是安装 Selenium 包,它可以使用命令安装在项目环境中。
pip install selenium
安装驱动
Selenium 使用浏览器的驱动接口。因此,需要安装特定于浏览器的驱动程序,以便 Selenium 能够创建运行自动化测试的浏览器实例。
| Chrome: | sites.google.com/a/chromium.… | | Edge: | developer.microsoft.com/en-us/micro… | | Firefox: | github.com/mozilla/gec… | | Safari: | webkit.org/blog/6900/w… |
我为这个特定的项目下载了 Firefox 驱动程序。驱动程序需要是可执行路径。
在windows 10中,将驱动文件放置在python应用程序安装的路径中,或环境变量中包含该路径的任何其他位置
创建简单的自动化脚本
我在项目根目录创建了一个python脚本文件 automation.py。
下面是一个使用Selenium打开网页的简单代码。
automation.py
from selenium import web-driver
browser = webdriver.Firefox()
browser.get('https://tabandspace.com')
编写Selenium 脚本
下面是一个常用 selenium 方法的备忘单
# 引入 selenium
from selenium import web-driver
# 创建 chrome 驱动
chromedriver = "C:/tests/chromedriver.exe"
driver = webdriver.Chrome(executable_path = chromedriver)
# 创建 firefox 驱动
geckodriver = "C:/tests/geckodriver.exe"
driver = webdriver.Firefox(executable_path = geckodriver)
# 创建 IE 驱动
iedriver = "C:/tests/IEDriverServer.exe"
driver = webdriver.Firefox(executable_path = iedriver)
# 打开一个网站
the_url = "https://dev.to"
driver.get(the_url)
# 通过id找到元素
the_id = 'register'
element = driver.find_element_by_id(the_id)
# 通过名字找到元素
the_name = 'register'
element = driver.find_element_by_id(the_name)
# 通过类名找到元素
the_class_name = 'nav-link'
element = driver.find_element_by_class_name(the_class_name)
# 通过标签,名找到元素
the_tag_name = 'a'
element = driver.find_element_by_tag_name(the_tag_name)
# 通过链接找到元素 ( 锚点元素 )
the_link_text = 'Sign Up'
element = driver.find_element_by_link_text(the_link_text)
# 通过部分链接查找元素 ( 锚点元素 )
the_partial_link_text = 'Sign'
element = driver.find_element_by_partial_link_text(the_partial_link_text)
# 使用css选择器找到元素
the_css_selector = 'a[href="/sign-up"]'
element = driver.find_element_by_css_selector(the_css_selector)
# 使用 x-path 找到元素
the_xpath = '//a[@href = "/sign-up"]'
element = driver.find_element_by_xpath(the_xpath)
# 点击一个元素
the_id = 'register'
element = driver.find_element_by_id(the_id)
element.click()
# 元素内部的类型
the_id = 'email'
the_email = 'klaus@werner.de'
element = driver.find_element_by_id(the_id)
element.send_keys(the_email)
# 从 select 元素中选择一个选项
the_id = 'country'
element = driver.find_element_by_id(the_id)
select_element = Select(element)
select_element.select_by_visible_text('Canada')
# 采取截图
the_path = 'C:/tests/screenshots/1.png'
driver.save_screenshot(the_path)
# 上传文件
the_file_path = 'C:/tests/files/example.pdf'
the_id = 'upload_button'
element = driver.find_element_by_id(the_id)
element.send_keys(the_file_path)
# 上传 javascript
js_code = 'document.getElementById("pop-up").remove()'
driver = execute_script(js_code)
# 切换到iframe
the_iframe_id = 'payment_section'
the_element_id = 'card_number'
the_iframe = driver.find_element_by_id(the_iframe_id)
driver.switch_to.frame(the_iframe)
element = driver.find_element_by_id(the_element_id)
element.send_keys('41111111111111')
driver.switch_to.default_content()
# 切换到下一个标签
global nextTab
global currentTab
nextTab = currentTab + 1
driver.switch_to_window(driver.window_handles[nextTab])
currentTab = currentTab + 1
# 切换到上一个标签
global previousTab
global currentTab
previousTab = currentTab - 1
driver.switch_to_window(driver.window_handles[previousTab])
currentTab = currentTab - 1
# 关闭标签
driver.close()
# 关闭警报
driver.switch_to.alert.accept()
# 刷新
driver.refresh()
# 焦点
the_id = "register"
the_element = driver.find_element_by_id(the_id)
hover = ActionChains(driver).move_to_element(the_element)
hover.perform()
# 右击
the_id = "register"
the_element = driver.find_element_by_id(the_id)
right_click = ActionChains(driver).context_click(the_element)
right_click.perform()
# 设置窗口尺寸
driver.set_window_size(1600, 1200)
# 按键
the_id = 'register'
element = driver.find_element_by_id(the_id)
element.send_keys(Keys.RETURN)
# 配置元素加载超时
from selenium.webdriver.support.ui import WebDriverWait
the_id = 'register'
WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID, the_id)))
# 模拟移动设备
google_pixel_3_xl_user_agent = 'Mozilla/5.0 (Linux; Android 9.0; Pixel 3 XL Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.98 Mobile Safari/537.36'
pixel_3_xl_emulation = {
"deviceMetrics": {
"width": 411,
"height": 731,
"pixelRatio": 3
},
"userAgent": google_pixel_3_xl_user_agent
}
options = webdriver.ChromeOptions()
options.add_experimental_option("mobileEmulation", pixel_3_xl_emulation)
driver = webdriver.Chrome(
executable_path = chromedriver,
chrome_options = options)
在构建管道中配置自动化测试
我发现了一篇很棒的文章,它描述了在构建管道(如Github工作流)中实现web自动化脚本的步骤。Selenium Base 是 Selenium 之上的一个很棒的包装器,它使安装驱动程序和向构建管道添加自动化脚本变得容易。
今天就到这里。明天是这个挑战的最后一天,我将分享这个月学习Python时收集到的各种Python资源。