什么是selenium?
Selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera,Edge等。这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本。
环境配置:
1.python3.7 pycharm或Visual Studio Code
2. pip install selenium
3.对应浏览器和驱动(没有找度娘)
初始化:
# 导入selenium包
from selenium import webdriver
# 新建driver对象,打开chrom浏览器
driver=webdriver.Chrome()
访问目标网站(这里以百度为例)
driver.get(r"https://www.baidu.com/")
基本操作:
# #浏览器最大化
driver.maximize_window()
# #自定义设置浏览器大小
driver.set_window_size(500,800)#宽高
# #浏览器最小化
driver.minimize_window()
# # 截图
driver.get_screenshot_as_file("a.png")
driver.save_screenshot("b.png")
## 打印标题
print(driver.title)
## 打印浏览器的名字
print(driver.name)
## 打印浏览器源码
print(driver.page_source)
##返回
driver.back()
# # 前进
driver.forward()
基本定位方法:
通过元素ID属性来定位元素(百度为例)
driver.find_element_by_id('元素id')
driver.find_elements_by_id('元素id')
driver.find_elements_by_id('kw')
通过元素name属性来定位元素
driver.find_element_by_name('元素name')
driver.find_elements_by_name('元素name')
driver.find_element_by_name('wd')
通过元素class属性来定位元素
driver.find_element_by_class_name('元素类名')
driver.find_elements_by_class_name('元素类名')
driver.find_elements_by_class_name('s_ipt')
通过元素标签之间的文本信息来定位元素
driver.find_element_by_link_text("文本内容")
driver.find_elements_by_link_text("文本内容")
driver.find_element_by_link_text("新闻")
通过元素之间的部分文本信息来定位元素
driver.find_element_by_partial_link_text(部分文本内容)
driver.find_elements_by_partial_link_text(部分文本内容)
driver.find_element_by_partial_link_text(“新”)
什么是Xpath
XPath是一门在XML文档中查找信息的语言。XPath可用来在XML文档中对元素和属性进行遍历。XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。起初XPath的提出的初衷是将其作为一个通用的、介于XPointer与XSL间的语法模型。但是XPath很快的被开发者采用来当作小型查询语言。
通过Xpath来定位元素
driver.find_element_by_xpath(元素的xpath)
driver.find_elements_by_xpath(元素的xpath)
# 根据相对路径定位
driver.find_element_by_xpath("//form[@id='form']/span/input").send_keys("为什么")
#根据元素id定位
driver.find_element_by_xpath("//input[@id='kw']").send_keys("为什么")
#根据元素name定位
driver.find_element_by_xpath("//input[@name='wd']").send_keys("为什么")
#根据元素class定位
driver.find_element_by_xpath("//input[@class='s_ipt']").send_keys("为什么")
# 根据元素标签之间文本定位
driver.find_element_by_xpath("//a[contains(text(),'新闻')]").click()
# 标签的某个属性以什么开头来定位
driver.find_element_by_xpath("//a[starts-with(@href,'http')]").click()
#a标签的href属性以heep开头并且文本内容为‘新闻’来定位
# driver.find_element_by_xpath("//a[starts-with(@href,'http')][contains(text(),'新闻')]").click()
#通过两个属性定位
driver.find_element_by_xpath("//input[@id='kw' and @name='wd']")
driver.find_element_by_xpath("//input[@id='kw' or @name='wd']")
通过tag_name 来定位元素
driver.find_element_by_tag_name(标签名称)
driver.find_elements_by_tag_name(标签名称)
#定位a标签
driver.find_element_by_tag_name("a")
通过css选择器来定位元素
driver.find_element_by_css_selector(元素的css选择器)
driver.find_elements_by_css_selector(元素的css选择器)
# 根据id定位
driver.find_element_by_css_selector("#kw").send_keys("213123")
# 根据id清空
driver.find_element_by_css_selector("#kw").clear()
# 根据class定位
driver.find_element_by_css_selector(".s_ipt").send_keys("20222020")
# 根据name定位
# driver.find_element_by_css_selector("[name = 'wd']").send_keys("123213424354")
#如果class属性里面有空格 用部分内容定位
# driver.find_element_by_css_selector("[class ~='bg']").click()
# 以什么开头
driver.find_element_by_css_selector("a[href^='http://news']").click()
# 已什么结尾
driver.find_element_by_css_selector("a[href$='123.com']").click()
#其他属性定位
driver.find_element_by_css_selector('[name='wd']')
driver.find_element_by_css_selector("[type='text']")
#两个其他属性组合定位
driver.find_element_by_css_selector([name='submit'][value='Delete'])
#匹配被-分割的属性值的方法,class
driver.find_element_by_css_selector("input[class|='s']") #要求精确填写的属性值
JS定位
#根据id定位 只有id是单式没有s
# js1 = "document.getElementById('kw').value='123456'"
# driver.execute_script(js1)
# 根据name定位 注意:必须是复数形式 必须要有下标
# js2 ="document.getElementsByName('wd')[0].value='2020202020'"
# driver.execute_script(js2)
# 根据class定位 注意:必须是复数形式 必须要有下标[0]
# js3 = "document.getElementsByClassName('s_ipt')[0].value='1352468'"
# driver.execute_script(js3)
# 根据所有id第一个是kw的标签
# js4 = "document.querySelectorAll('#kw')[0].value='1458795'"
# driver.execute_script(js4)
# 根据标签定位
# js5 ="document.getElementByTagName('input').click()"
Jquery行为定位
#发送文本语法:
$(css selector).val(输入值)
#清空文本语法:
$(css selector).val('') #空字符串
#点击按钮:
$(css selector).click()
# 根据id定位
# s = "$('#kw').val('1233')"
# driver.execute_script(s)
# time.sleep(3)
# # 清空文本
# s ="$('#kw').val('')"
# driver.execute_script(s)
# # 根据id点击
# s ="$('#kw').click()"
# driver.execute_script(s)
jquery事件
s = '''$('[name="wd"]').val('selenium')'''
#执行脚本
driver.execute_script(s)
sleep(3)
#清空
clear = "$('#kw').val('')"
driver.execute_script(clear)
#Id
inputTest="$('#smart_input').val('文本')"
#Class
inputTest="$('.usersearch').val('文本')"
#Type
inputTest="$(':text').val('文本')"
#层级
inputTest="$('#searchForm>#smart_input').val('文本')"
inputTest="$('#searchForm #smart_input ').val('文本')"
#【注意两个id选择器“#searchForm #smart_input”中间是一个空格】
inputTest="$('#searchForm>input:first').val('文本')"
#选择最后一个input元素:
clickbutton="$('#searchForm>input:last').click()"
#选择第几个input元素:
inputTest="$('#searchForm>input:eq(0)').val('文本')"
#从0开始算第一个
inputTest="$('#searchForm>input:nth-child(1)').val('文本')"
下拉框
#先定位select框,再定位select里的选项
driver.find_element_by_id("nr").find_element_by_xpath("//option[@value='50']").click()
#Select模块
from selenium.webdriver.support.select import Select