python自动化测试工具selenium_python测试工具,2024年最新渣本毕业两年经验
input。
先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新软件测试全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024b (备注软件测试)
正文
其中各参数含义如下:
driver
:浏览器驱动timeout
:最长超时时间,默认以秒为单位poll_frequency
:检测的间隔(步长)时间,默认为0.5秒
ignored_exceptions
:忽略的异常,即使在调用until()
或until_not()
的过程中抛出给定异常也不中断
WebDriverWait()
一般配合until()
或until_not()
方法使用,表示等待阻塞直到返回值为True
或者False
,需要注意这两个方法的参数都需是可调用对象,即方法名称,可以使用expected_conditions
模块中的方法或者自己封装的方法。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
driver = webdriver.Chrome()
driver.get(“http://baidu.com”)
判断id为input
的元素是否被加到了dom树里,并不代表该元素一定可见,如果定位到就返回WebElement
element = WebDriverWait(driver, 5, 0.5).until(expected_conditions.presence_of_element_located((By.ID, “s_btn_wr”)))
implicitly_wait和WebDriverWait都设置时,取二者中最大的等待时间
driver.implicitly_wait(5)
判断某个元素是否被添加到了dom里并且可见,可见代表元素可显示且宽和高都大于0
WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.ID, ‘su’)))
判断元素是否可见,如果可见就返回这个元素
WebDriverWait(driver,10).until(EC.visibility_of(driver.find_element(by=By.ID, value=‘kw’)))
下面列出expected_conditions
常用的一些方法:
title_is
: 判断当前页面title是否精确等于预期title_contains
: 判断当前页面title是否包含预期字符串presence_of_element_located
: 判断某个元素是否被加到了dom树里,并不代表该元素一定可见visibility_of_element_located
: 判断某个元素是否可见(元素非隐藏,并且元素的宽和高都不等于0)visibility_of
: 跟上面的方法做一样的事情,只是上面的方法要传入locator,这个方法直接传定位到的element就好了presence_of_all_elements_located
: 判断是否至少有1个元素存在于dom树中。举个例子,如果页面上有n个元素的class都是’column-md-3’,那么只要有1个元素存在,这个方法就返回Truetext_to_be_present_in_element
: 判断某个元素中的text是否包含了预期的字符串text_to_be_present_in_element_value
: 判断某个元素中的value属性是否包含了预期的字符串frame_to_be_available_and_switch_to_it
: 判断该frame是否可以switch进去,如果可以的话,返回True并且switch进去,否则返回Falseinvisibility_of_element_located
: 判断某个元素中是否不存在于dom树或不可见element_to_be_clickable
: 判断某个元素中是否可见并且是enable的,这样的话才叫clickablestaleness_of
: 等某个元素从dom树中移除,注意,这个方法也是返回True或Falseelement_to_be_selected
: 判断某个元素是否被选中了,一般用在下拉列表element_selection_state_to_be
: 判断某个元素的选中状态是否符合预期element_located_selection_state_to_be
: 跟上面的方法作用一样,只是上面的方法传入定位到的element,而这个方法传入locator
检测document
是否加载完成
另外还可以使用driver.execute_script('return document.readyState;') == 'complete'
来检测document
是否加载完成。
注意document
加载完成,是不包括那种异步加载ajax请求动态渲染dom的,这种需要使用WebDriverWait
检测某个元素是否渲染完成。
selenium元素定位和读取
查找元素
selenium提供了一系列api方便获取chrome中的元素,这些API都返回WebElement
对象或其列表,如:
find_element_by_id(id)
: 查找匹配id的第一个元素find_element_by_class_name()
: 查找匹配class
的第一个元素find_elements_by_xpath()
: 查找匹配xpath
的所有元素find_elements_by_css_selector()
: 查找匹配css选择器的所有元素
其实可以看WebDriver
类里面的实现源码,其核心实现都是调用两个基本函数:
find_element(self, by=By.ID, value=None)
: 查找匹配策略的第一个元素find_elements(self, by=By.ID, value=None)
: 查找匹配策略的所有元素
其中by
参数可以是ID
, CSS_SELECTOR
, CLASS_NAME
, XPATH
等。下面举几个简单的例子:
- 通过xpath查询包含文本
登录
的第一个元素:find_element_by_xpath("//*[contains(text(),'登录')]")
- 查询包含类名
refresh
的所有元素:find_elements_by_class_name('refresh')
- 查询
table
表格的第二行:find_element_by_css_selector('table tbody > tr:nth(2)')
dom元素交互
上面介绍的元素查找结果WebElement
对象,常用的api有:
element.text
: 返回元素的文本内容(包括所有后代节点的内容),注意如果元素display=none
则返回为空字符串element.screenshot_as_png
: 元素的截图element.send_keys("input")
: 元素输入框输入input
字符串element.get_attribute('data-v')
: 获取data-v
名称属性值,除了自定义节点属性,还可以获取如textContent
等属性element.is_displayed()
: 判断元素是否用户可见element.clear()
: 清除元素文本element.click()
: 点击元素,如果元素不可点击会抛出ElementNotInteractableException
异常element.submit()
: 模拟表单提交
查找元素失败处理
如果找不到指定元素,则会抛出NoSuchElementException
异常,而且需要注意,display=none
的元素是可以获取到的,凡是在dom
节点中的元素都可以获取到。
而且实际使用的时候要注意一些js代码动态创建的元素,可能需要轮询获取或者监控。
一个检查是否存在指定元素的方法如下:
def check_element_exists(xpath):
try:
driver.find_element_by_xpath(xpath)
except NoSuchElementException:
return False
return True
selenium交互控制
ActionChains
动作链
webdriver通过ActionChains
对象来模拟用户操作,该对象表示一个动作链路队列,所有操作会依次进入队列但不会立即执行,直到调用perform()
方法时才会执行。其常用方法如下:
click(on_element=None)
: 单击鼠标左键click_and_hold(on_element=None)
: 点击鼠标左键,不松开context_click(on_element=None)
: 点击鼠标右键double_click(on_element=None)
: 双击鼠标左键send_keys(*keys_to_send)
: 发送某个键到当前焦点的元素send_keys_to_element(element, *keys_to_send)
: 发送某个键到指定元素key_down(value, element=None)
: 按下某个键盘上的键key_up(value, element=None)
: 松开某个键drag_and_drop(source, target)
: 拖拽到某个元素然后松开drag_and_drop_by_offset(source, xoffset, yoffset)
: 拖拽到某个坐标然后松开move_by_offset(xoffset, yoffset)
: 鼠标从当前位置移动到某个坐标move_to_element(to_element)
: 鼠标移动到某个元素move_to_element_with_offset(to_element, xoffset, yoffset)
: 移动到距某个元素(左上角坐标)多少距离的位置perform()
: 执行链中的所有动作release(on_element=None)
: 在某个元素位置松开鼠标左键
模拟鼠标事件
下面代码模拟鼠标移动,点击,拖拽等操作,注意操作时需要等待一定时间,否则页面还来不及渲染。
from time import sleep
from selenium import webdriver
引入 ActionChains 类
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
driver.get(“https://www.baidu.cn”)
action_chains = ActionChains(driver)
target = driver.find_element_by_link_text(“搜索”)
移动鼠标到指定元素然后点击
action_chains.move_to_element(target).click(target).perform()
time.sleep(2)
也可以直接调用元素的点击方法
target.click()
time.sleep(2)
鼠标移动到(10, 50)坐标处
action_chains.move_by_offset(10, 50).perform()
time.sleep(2)
鼠标移动到距离元素target(10, 50)处
action_chains.move_to_element_with_offset(target, 10, 50).perform()
time.sleep(2)
鼠标拖拽,将一个元素拖动到另一个元素
dragger = driver.find_element_by_id(‘dragger’)
action.drag_and_drop(dragger, target).perform()
time.sleep(2)
也可以使用点击 -> 移动来实现拖拽
action.click_and_hold(dragger).release(target).perform()
time.sleep(2)
action.click_and_hold(dragger).move_to_element(target).release().perform()
模拟键盘输入事件
通过send_keys
模拟键盘事件,常用有:
send_keys(Keys.BACK_SPACE)
: 删除键(BackSpace)send_keys(Keys.SPACE)
: 空格键(Space)send_keys(Keys.TAB)
: 制表键(Tab)send_keys(Keys.ESCAPE)
: 回退键(Esc)send_keys(Keys.ENTER)
: 回车键(Enter)send_keys(Keys.F1)
: 键盘 F1send_keys(Keys.CONTROL,'a')
: 全选(Ctrl+A)send_keys(Keys.CONTROL,'c')
: 复制(Ctrl+C)send_keys(Keys.CONTROL,'x')
: 剪切(Ctrl+X)send_keys(Keys.CONTROL,'v')
: 粘贴(Ctrl+V)
示例:定位到输入框,然后输入内容
输入框输入内容
driver.find_element_by_id(“kw”).send_keys(“uusamaa”)
模拟回车删除多输入的一个字符a
driver.find_element_by_id(“kw”).send_keys(Keys.BACK_SPACE)
警告框处理
用于处理调用alert
弹出的警告框。
driver.switch_to_alert()
: 切换到警告框text
:返回alert/confirm/prompt
中的文字信息,比如js调用alert('failed')
则会获取failed
字符串accept()
:接受现有警告框dismiss()
:关闭现有警告框send_keys(keysToSend)
:将文本发送至警告框
selenium浏览器控制
基本常用api
下面列出一些非常实用的浏览器控制api:
driver.current_url
: 获取当前活动窗口的urldriver.switch_to_window("windowName")
: 移动到指定的标签窗口driver.switch_to_frame("frameName")
: 移动到指定名称的iframe
driver.switch_to_default_content()
: 移动到默认文本内容区driver.maximize_window()
: 将浏览器最大化显示driver.set_window_size(480, 800)
: 设置浏览器宽480、高800显示driver.forword()
,driver.back()
: 浏览器前进和后退driver.refresh()
: 刷新页面driver.close()
: 关闭当前标签页driver.quiit()
: 关闭整个浏览器driver.save_screenshot('screen.png')
: 保存页面截图driver.maximize_window()
: 将浏览器最大化显示browser.execute_script('return document.readyState;')
: 执行js脚本
selenium读取和加载cookie
使用get_cookies
和add_cookie
可以实现将cookie缓存到本地,然后启动时加载,这样可以保留登录态。实现如下
import os
import json
from selenium import webdriver
driver = webdriver.Chrome()
driver.get(“https://www.baidu.cn”)
读取所有cookie并保存到文件
cookies = driver.get_cookies()
cookie_save_path = ‘cookie.json’
with open(cookie_save_path, ‘w’, encoding=‘utf-8’) as file_handle:
json.dump(cookies, file_handle, ensure_ascii=False, indent=4)
从文件读取cookie并加载到浏览器
with open(cookie_save_path, ‘r’, encoding=‘utf-8’) as file_handle:
cookies = json.load(file_handle)
for cookie in cookies:
driver.add_cookie(cookie)
selenium打开新的标签页窗口
使用driver.get(url)
会默认在第一个标签窗口打开指定连接,点击页面中的_blank
的链接时也会打开一个新的标签窗口。
还可以用下面的方式手动打开一个指定页面的标签窗口,需要注意打开新窗口或者关闭以后,还需要手动调用switch_to.window
切换当前活动的标签窗口,否则会抛出NoSuchWindowException
异常。
from selenium import webdriver
driver = webdriver.Chrome()
driver.get(“https://www.baidu.cn”)
new_tab_url = ‘http://uusama.com’
driver.execute_script(f’window.open(“{new_tab_url}”, “_blank”);')
time.sleep(1)
注意:必须调用switch_to.window手动切换window,否则会找不到tab view
聚焦到新打开的tab页面,然后关闭
driver.switch_to.window(driver.window_handles[1])
time.sleep(2)
driver.close() # 关闭当前窗口
手动回到原来的tab页面
driver.switch_to.window(driver.window_handles[0])
time.sleep(1)
除了使用execute_script
外,还可以使用模拟打开新tab页按键的方式新建一个标签页窗口:
driver.find_element_by_tag_name('body').send_keys(Keys.CONTROL + 't')
ActionChains(driver).key_down(Keys.CONTROL).send_keys('t').key_up(Keys.CONTROL).perform()
selenium一些问题记录
获取隐藏元素的文本内容
如果一个元素是隐藏的,即display=none
,虽然可以通过find_element
查找到该元素,但是用element.text
属性是获取不到该元素文本内容的,其值是空字符串,这时可以用下面的方式获取:
element = driver.find_element_by_id(‘uusama’)
driver.execute_script(“return arguments[0].textContent”, element)
driver.execute_script(“return arguments[0].innerHTML”, element)
相应的也可以把隐藏的元素设置为非隐藏
driver.execute_script(“arguments[0].style.display = ‘block’;”, element)
浏览器崩溃WebDriverException
异常处理
比如在Chrome
中长时间运行一个页面会出现Out Of Memory
内存不足的错误,此时WebDriver
会抛出WebDriverException
异常,基本所有api都会抛出这个异常,这个时候需要捕获并进行特殊处理。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注软件测试)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
ption`异常处理
比如在Chrome
中长时间运行一个页面会出现Out Of Memory
内存不足的错误,此时WebDriver
会抛出WebDriverException
异常,基本所有api都会抛出这个异常,这个时候需要捕获并进行特殊处理。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注软件测试)
[外链图片转存中…(img-gHADmUCU-1713356014702)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。
更多推荐
所有评论(0)