软件测试 selenium
selenium基础
selenium是什么
自动化web浏览器的工具
selenium IDE
是selenium脚本的集成开发环境,允许记录和调试测试
selenium webDriver优于selenium RC的优点?
selenium使用
selenium操作浏览器
初始项目
from selenium import webdriverfrom selenium.webdriver.chrome.options import Optionsfrom selenium.webdriver.chrome.service import Service# 设置启动浏览器对象def startChrome(): q1=Options() q1.add_argument(\'--no-sandbox\') q1.add_experimental_option(\'detach\',True) a1 = webdriver.Chrome(service=Service(\'chromedriver.exe\'),options=q1) return a1driver = statchrome()driver.get(\'https://www.baidu.com\')driver.close()# 关闭浏览器driver.quite()
import timefrom selenium import webdriver# 启动Chrome浏览器driver = webdriver.Chrome()# 打开一个网页driver.get(\"https://www.baidu.com\")# 获取当前页面的标题print(driver.title)# 获取当前页面的URLprint(driver.current_url)# 最大化浏览器窗口driver.maximize_window()# 最小化浏览器窗口driver.minimize_window()# 设置浏览器窗口大小driver.set_window_size(800, 600)time.sleep(5)# 关闭浏览器driver.quit()
浏览器控制
# 获取当前页面的标题print(driver.title)# 获取当前页面的URLprint(driver.current_url)# 最大化浏览器窗口driver.maximize_window()# 最小化浏览器窗口driver.minimize_window()# 设置浏览器窗口大小driver.set_window_size(800, 600)# 关闭浏览器driver.quit()
定位元素
# 八种定位元素方式# id,name,class_name,tag_name,link_text,xpath,css_selector,partial_link_text# 通过id定位元素# 1.一般比较准确,可以通过控制台查找# 2.并不是所有网页或元素都有id值element = driver.find_element(\"id\", \"element_id\")# 通过name定位元素element = driver.find_element(\"name\", \"element_name\")# 通过class_name定位元素# 1.class值不能有空格,会报错# 2.class值重复比较多,需要进行切片# 3. class值部分网站是随机的# a.find_element(By.CLASS_NAME,value=\'s_ipt\').send_keys(\'defalt\')element = driver.find_element(\"class name\", \"element_class\")# 通过tag_name定位元素# 基本没有唯一元素# 重复多,也需要切片element = driver.find_element(\"tag name\", \"div\")# 通过link_text定位元素element = driver.find_element(\"link text\", \"Example Link\")# 通过partial_link_text定位元素# 模糊链接文本element = driver.find_element(\"partial link text\", \"Example\")# 通过xpath定位元素# 1.xpath是路径,定位到元素# 2.xpath是唯一的,定位到唯一的元素# 3.xpath是动态的,定位到动态的元素# 通过属性定位到路径element = driver.find_element(\"xpath\", \"//div[@class=\'example-class\']\")# 元素定位-LINK-TEXT# 默认搜索a标签# 通过精准链接文本找到标签a的元素# a.find_element(By.LINK_TEXT,value=\'新闻\').Click()# 通过css_selector定位元素# 样式选择器,多功能定位# a.find_element(By.CSS_SELECTOR,value=\'.s_ipt\').send_keys(\'defalt\')# 不加修饰符 = 标签头 通过标签头定位# 4,通过任意类型定位:\"[类型=\'精准值\']\"# 4,通过任意类型定位:\"[类型*=\'模糊值\']\"# 4,通过任意类型定位:\"[类型^=\'开头值\']”# 4,通过任意类型定位:\"「类型$\'结尾值\'1\"element = driver.find_element(\"css selector\", \"div.example-class\")
元素信息操作
鼠标和键盘操作
# 鼠标悬停element = driver.find_element(By.ID, \"hover_element\")ActionChains(driver).move_to_element(element).perform()# 鼠标右键ActionChains(driver).context_click(element).perform()# 鼠标双击ActionChains(driver).double_click(element).perform()# 按住鼠标左键拖动source = driver.find_element(By.ID, \"source_element\")target = driver.find_element(By.ID, \"target_element\")ActionChains(driver).drag_and_drop(source, target).perform()# 键盘操作:输入文本input_element = driver.find_element(By.ID, \"input_element\")input_element.send_keys(\"Hello, Selenium!\")# 键盘操作:按下并释放键input_element.send_keys(Keys.CONTROL, \'a\') # 全选input_element.send_keys(Keys.CONTROL, \'c\') # 复制input_element.send_keys(Keys.CONTROL, \'v\') # 粘贴
鼠标操作
元素等待
显示等待和隐式等待
隐式等待:对所有元素查找操作设置最大等待时间。等待时间设置的一个最大值,超时未出现的话会报错。简单等待,元素出现就可以继续。
显示等待:已知具体的等待条件,可以设置等待某个条件,比如设置等待某个元素可以点击等等。适合用在复杂场景。
给定时间找到元素执行执行后续操作;没有找到报错
# 隐式等待:对所有元素查找操作设置最大等待时间driver.implicitly_wait(10) # 单位为秒# 显式等待:等待某个特定条件成立try: element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, \"dynamic_element\")) ) print(\"Element found\")except: print(\"Element not found\")
下拉选择框、弹出框、滚动条操作
下拉选择框
# 定位下拉选择框dropdown = driver.find_element(By.ID, \"dropdown_element\")# 使用Select类操作下拉选择框select = Select(dropdown)# 通过索引选择选项select.select_by_index(1)# 通过值选择选项select.select_by_value(\"option_value\")# 通过可见文本选择选项select.select_by_visible_text(\"Option Text\")
弹出框
Selenium可以处理JavaScript弹出框,如alert
、confirm
和prompt
。
# 触发弹出框driver.find_element(By.ID, \"alert_button\").click()# 切换到弹出框alert = driver.switch_to.alert# 获取弹出框文本print(alert.text)# 点击“确定”按钮alert.accept()# 点击“取消”按钮(仅对confirm和prompt有效)# alert.dismiss()# 输入文本(仅对prompt有效)# alert.send_keys(\"Hello, Selenium!\")
滚动条
# 滚动到页面底部driver.execute_script(\"window.scrollTo(0, document.body.scrollHeight);\")# 滚动到页面顶部driver.execute_script(\"window.scrollTo(0, 0);\")# 滚动到指定元素位置element = driver.find_element(By.ID, \"target_element\")driver.execute_script(\"arguments[0].scrollIntoView();\", element)
1,在HTML页面中,由于前端技术框架的原因,页面元素为动态显示,元素根据滚动条的下拉而被加载
2.页面注册同意条款,需要滚动条到最底层,才能点击同意
通过js代码来操作滚动条
frame切换、多窗口切换
# 切换到iframeiframe = driver.find_element(By.ID, \"iframe_element\")driver.switch_to.frame(iframe)# 操作iframe中的元素element = driver.find_element(By.ID, \"iframe_element_inside\")element.click()# 切换回主文档driver.switch_to.default_content()
多窗口切换
# 打开一个新的窗口driver.execute_script(\"window.open(\'https://www.google.com\');\")# 获取所有窗口句柄windows = driver.window_handles# ->获取当前窗口句柄driver.current_window_handle# 切换到新窗口driver.switch_to.window(windows[1])print(driver.current_url) # 输出新窗口的URL# 切换回主窗口driver.switch_to.window(windows[0])print(driver.current_url) # 输出主窗口的URL
窗口截图、验证码处理
# 对整个页面截图driver.save_screenshot(\"screenshot.png\")# 对特定元素截图element = driver.find_element(By.ID, \"target_element\")element.screenshot(\"element_screenshot.png\")
验证码处理
# 定位验证码输入框captcha_input = driver.find_element(By.ID, \"captcha_input\")# 手动输入验证码captcha_code = input(\"请输入验证码:\")captcha_input.send_keys(captcha_code)# 提交表单driver.find_element(By.ID, \"submit_button\").click()
cookie
自动化测试
自动化测试原理
自动化框架构建
框架:页面库,数据驱动,测试脚本,测试报告,持续集成
页面对象库对自动化包括工具(selenium,appium)API的二次封装,还有使用二次封装后的自动化工具类的页面元素封装
数据驱动:测试脚本中使用的数据文件以及读取方法类
测试脚本:主要通过pytest测试框架进行编写,选择其原因主要支持assert断言,适合复杂度功能测试,执行过程可以自定义用例执行顺序和跳过以及预期,支持重复执行,并兼容unittest编写的测试用例。
测试报告:通过pytest自动生成的allure报告,也可以集成在jenkins重
持续集成:jekins实现,目的在于测试脚本无人值守执行以及自动生成测试报告。方便测试人员能够省出时间进行更多的功能测试和探索性测试。
如何设计自动化测试用例
编写测试脚本之前要编写测试用例,测试用例不能直接使用手工测试点用例;
自动化的测试用例是一个完整的场景。用户登录系统到用户退出。
用例之验证一个功能点。不用试图登陆后验证所有的功能在退出
测试用例尽量只做正向的逻辑验证。
用例之间不要产生关联,相互独立,也要高内聚,低耦合
测试用例关注的是功能逻辑的实现,字段无关
测试用例的上下文必须有一定的顺序性,前置条件清晰
检查点的设置要侧重,全面,灵活
测试用例对数据的操作要进行还原
测试用例必须是可回归的
用例选择遵循成本始终,构建场景,目的冒烟回归,繁琐功能,主体流程
webdriver如何开启和退出一个浏览器?
开启:dr=webdriver.浏览器类型()关闭:dr.quit()
自动化测试框架
Selenium Hub
selenium server是使用单个服务器作为测试节点的一个独立的应用程序,selenium hub代理一个或者多个selenium节点的示例,一个hub和多个node被称为selenium grid。运行seleniumServer在同一个主机上用一个hub和单个节点创建de selenium grid类似
selenium连接到数据库
如何验证多个页面存在同一个对象
XPath中使用单斜杠和双斜杠有什么区别?
自动化测试细节
如何在页面加载成功后验证元素的存在?
Selenium Grid的了解
使用计算机基础架构大幅加速web应用程序功能测试的工具,允许测试者轻松在多台机器上并行运行多个测试,并可以在异构环境中运行。
集成显示了所有selenium远程控制,不必担心实际的基础设施,selenium Grid将运行selenium测试套件所需的时间,缩短到selenium实例的单个实例运行时间的一小点。
Selenium中有娜些验证点?
Selenium主要有三种验证点:
检查页面标题
检查某些文字
检查某些元素(文本框,下拉菜单,表等)
XPath使用,什么时候在selenium中使用Xpath?
CSS定位器策略?
多个定位器选择
如果有唯一的名称或标识符可用,那么应该使用它们来代替XPath和CSS定位器。如果没有,那么CSS定位器应该被优先考虑,因为在大多数现代浏览器中,它们的评估速度比XPth更快。
窗口弹出机制控制
可以使用命令getWindowHandles(()来处理多个弹出窗口。
然后将所有窗口名称存储到St变量中并将其转换为数组。
接下来,通过使用数组索引,导航到特定的窗口。
driver.switchTo().window(Arraylndex);
隐式等待与显式等待有什么不同?
如何处理Selenium WebDriver中的警报/弹出窗口?
Selenium WebDriver中的可用定位器是什么?
其它
大致分类和比较TDD/BDD和DDD框架?
数据驱动架构和关键字驱动框架
数字驱动框架:
测试用例逻辑驻留在测试脚本中。测试数据分离保存在测试脚本之外,测试数据是从外部文件中读取,并加载到测试脚本中的变量中。变量用于输入值和验证之
关键字驱动:
关键字/表驱动框架需要开发数据表和关键字。独立于执行它们的测试自动化工具。可以使用或不适用应用程序来设计测试。关键字驱动的测试中,被测试的应用程序的功能记录在一个表格中,以及每个测试的分布说明。