Selenium常用API之操作浏览器
#打开
dr = webdriver.Chrome()
dr.get('https://www.baidu.com')
#关闭
dr.close()#关闭所有打开的页面
dr.quit()#关闭当前页面
#窗口设置
dr.maximize_window()#最大化
dr.minimize_window()#最小化
dr.set_window_size(400,600)#设置指定大小
#后退、前进和刷新
dr.back()
dr.forward()
dr.refresh()
Selenium:常用API之元素定位
几种定位方式:
dr.find_element_by_id()
dr.find_element_by_name()
dr.find_element_by_tag_name()#标签名
dr.find_element_by_link_text()#链接文本
dr.find_element_by_partial_link_text()
dr.find_element_by_class_name()
dr.find_element_by_css_selector()
dr.find_element_by_xpath()
注:
1.确保唯一属性的情况下,定位推荐使用顺序id-name-xpath-other;
2.定位一组具有相同属性的元素,例如:dr.find_elements_by_name();
3.有时即便有id也不能通过id定位,因为它可能是动态id;
4.由于selenium使用xpath定位时采用遍历页面的方式,在性能上采用CSS选择器的方式更优。xpath虽然性
能指标较差,但是在浏览器中有比较好的插件支持,定位元素比较方便,对于性能要求严格的场景,可考虑通过xpath改写css的方式进行替换。
标题xpath基础语法:
/:从根开始
//:从任意节点开始找
*:代表任意节点名称
@:代表属性
text():节点文本
[]:通过下表定位
.:当前节点
…:父节点
xpath几种定位方式:
1)全路径
/html/body/table/tbody/tr[2]/td[2]/div/div[1]/div[2]/input
2)节点属性
//input[@value=“新建”]
3)节点文本
//option[text()=“AgileoneDemo”]
4)关联属性定位
//input[@value=“新建” and @type=“button”]
5)父节点定位
//table[@class=“table-admin”]/thead[@class=“bottomhr”]
6)通过下标定位
//*[@id=“dtrow_6”]/td[2]
7)模糊匹配属性
//tr[contains(@id,‘dtrow’)]/td[2]
Selenium:常用API之元素操作
dr.find_element_by_name(“tj_trnews”).text#获取文本
dr.find_element_by_id(“kw”).click()#单击
dr.find_element_by_id(“kw”).send_keys(“selenium”)#输入内容
dr.find_element_by_id(“kw”).clear()#清空输入内容
dr.find_element_by_id(“kw”).get_attribute(“name”)#获取属性值
dr.find_element_by_id(“kw”).is_displayed()#是否显示
dr.find_element_by_id(“kw”).is_enabled()#是否可用
dr.find_element_by_id(“kw”).is_selected()#复选框是否被选中
下拉列表选项处理
方法1:关联定位,也叫二次定位
dr.find_element_by_id("newitem").find_element_by_xpath("//*[@value='proposal']").click()
方法2:Select
from selenium.webdriver.support.select import Select
Select(dr.find_element_by_id("newitem")).select_by_value("proposal")#根据value选择
Select(dr.find_element_by_id("newitem")).select_by_visible_text("※ 需求提案 ※")#根据text选择
Select(dr.find_element_by_id("newitem")).select_by_index(3)#根据索引选择
Selenium:设置等待时间
强制等待
from time import sleep
sleep(3)
隐式等待:针对所有元素
dr.implicitly_wait(30)
显示等待:针对指定元素
from selenium.webdriver.support.wait import WebDriverWait
element = WebDriverWait(dr,30,0.5).until(lambda dr: dr.find_element_by_id(“msg”))
content = element.text
Selenium:窗口切换
自定义弹窗切换:可直接定位弹窗上的元素进行操作,无需切换
自定义弹窗切换:可直接定位弹窗上的元素进行操作,无需切换
多页面(windows句柄)切换:
nowhandle = dr.current_window_handle#获得当前句柄
dr.find_element_by_xpath("//*[@id='1']/h3/a").click()#打开官网
allhandle = dr.window_handles#获得所有句柄
for handle in allhandle:
if handle != nowhandle:
dr.switch_to.window(handle)
dr.find_element_by_id("poplogin").click()#点击登录
dr.close()
alert、 confirm和prompt弹窗切换
# alert弹窗:
# alert("hello")
# confirm弹窗:
# if(confirm("是否?")){}
# prompt弹窗:
# var info = prompt("请输入:")
# alert = dr.switch_to.alert#切换弹窗
# content = alert.text#获取弹窗内容
# alert.accept()#点击确定
# alert.dismiss()#点击取消
# alert.send_keys("你好!")#输入内容
切换frame窗口
dr.switch_to.frame(dr.find_element_by_id("FreeTextBox1_editor"))#方式1:如果没有frame id时可使用
dr.switch_to.frame("FreeTextBox1_editor")#方式2:推荐
dr.switch_to.default_content()#返回原页面
Selenium:文件上传
方式1:通过send_keys()
driver.find_element_by_id("batchfile").send_keys('D:\\UI自动化\\PiCiDaoRu.xls')
driver.find_element_by_xpath("//input[@value='确认导入本批次商品信息']").click()
方式2:通过PyKeyboar,需要依次安装pyHook和PyUserInput
from pykeyboard import PyKeyboard
try:
driver.find_element_by_id("batchfile").click()#用firefox不行,chrome可以
except Exception as e:
driver.find_element_by_xpath("//*[@class='col-lg-5 col-md-5 col-sm-5 col-xs-5'][2]").click()
sleep(3)
k = PyKeyboard()
k.type_string("E:\\study\\PycharmProjects\\python_3issue\\GUI\\PiCiDaoRu.xls")#不支持中文
k.press_keys([k.alt_key,'o'])#alt+o组合键点击确定
sleep(1)
driver.find_element_by_xpath("//input[@value='确认导入本批次商品信息']").click()
方式3:使用sikulix的jar包
方式4:其它,比如AutoIt
Selenium:鼠标事件
from selenium.webdriver.common.action_chains import ActionChains
right = dr.find_element_by_id("barcode") #定位到元素
ActionChains(dr).click(right).perform()#单击
ActionChains(dr).context_click(right).perform()#对定位到的元素执行鼠标右键操作
ActionChains(dr).double_click(right).perform()#双击
ActionChains(dr).move_to_element (right).perform()#鼠标悬停在一个元素上
ActionChains(dr).click_and_hold(right).perform()#按下鼠标左键在一个元素上
element = dr.find_element_by_name("xxx") #定位元素的原位置
target = dr.find_element_by_name("xxx") #定位元素要移动到的目标位置
ActionChains(dr).drag_and_drop(element, target).perform()#拖动
# ActionChains(dr):dr: wedriver 实例执行用户操作。ActionChains 用于生成用户的行为;所
有的行为都存储在 ActionChains 对象。通过 perform()执行存储的行为。
# perform():执行所有 ActionChains 中存储的行为。perfrome()同样也是 ActionChains 类提
供的的方法,通常与ActionChains()配对使用。
Selenium:键盘事件
from selenium.webdriver.common.keys import Keys
driver.find_element_by_id("barcode").send_keys("123456")
driver.find_element_by_id("barcode").send_keys(Keys.BACK_SPACE)#单击回删键
driver.find_element_by_id("barcode").send_keys(Keys.SPACE)#单击空格
driver.find_element_by_id("barcode").send_keys(Keys.ENTER) #通过回车键盘来代替点击操作
driver.find_element_by_id(“barcode”).send_keys(Keys.DOWN) #单击向下键
#。。。。。。
driver.find_element_by_id("barcode").send_keys(Keys.CONTROL,'a') #ctrl+a 全选输入框内容
driver.find_element_by_id("barcode").send_keys(Keys.CONTROL,'c')
driver.find_element_by_id("barcode").send_keys(Keys.CONTROL,'v')
driver.find_element_by_id("barcode").send_keys(Keys.CONTROL,'x')
#。。。。。。
Selenium:JS注入
移动滚动条
#方式1:没有ID的滚动条不支持
js="var q=document.documentElement.scrollTop=10000"
# js_="var q=document.documentElement.scrollTop=0"
driver.execute_script(js_)
#方式2:拖动到指定元素
# target1 = dr.find_element_by_xpath("//*[text()='页顶']")
# dr.execute_script("arguments[0].scrollIntoView();", target1)
修改属性
dr.execute_script("document.getElementById('barcode').readOnly=true;")
dr.execute_script("document.getElementById('barcode').removeAttribute('readonly');")
Selenium:验证码处理
方式1:屏蔽验证码
方式2:设置万能验证码
方式3:图像识别技术
方式4:添加cookie
driver.get("http://qzx:8080/selenium3.0/")
driver.add_cookie({'name':'username', 'value':'admin'})
driver.add_cookie({'name':'password', 'value':'admin'})
driver.get("http://qzx:8080/selenium3.0/")
Selenium:截图
方式1:
import time
now = time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime())
dr.get_screenshot_as_file(".\\screen\\" + now + "error_png.png")#推荐
方式2:
dr.save_screenshot(".\\screen\\" + now + "error_png.png")#遇到alert弹窗截图会报错,不推荐
方式3:
s = dr.get_screenshot_as_base64()#保存的是base64()格式的文件值,html测试报告里插入图片会用到
print("base64()格式:%s" %s)
方式4:
s = dr.get_screenshot_as_png()#保存二进制数据
print(s)