selenium常用API介绍
文本的清空与提交
br.find_element_by_id("xxx").clear()#清空文本
br.find_element_by_id("xxx").submit()#提交,当然也可以点击提交按钮提交
退出游览器
br.close()#关闭当前选项卡
br.quit()#退出整个游览器
获取页面标题和当前页面源码
#这两个都是属性
br.title
br.page_source
游览器窗口最大化
br.maximize_window()
刷新页面
br.refresh()
前进后退
br.back()
br.forward()
多窗口切换
1.通过循环切换
from selenium import webdriver
br = webdriver.Firefox()
br.get("https://www.baidu.com")
h = br.current_window_handle #获取当前窗口句柄
for i in br.window_handles:
if h!= i:
br.switch_to.window(i) #如果不是当前窗口,那么将焦点切换到新的窗口
...这里是切换窗口后在新窗口中做的操作
br.switch_to.window(h) #切回原来的窗口
...
2.通过窗口句柄编号切换
from selenium import webdriver
br = webdriver.Firefox()
br.get("https://www.baidu.com")
h = br.window_handles[0]
new = br.window_handles[1]
br.switch_to.window(new) #切换到新窗口
...操作新窗口
br.switch_to.window(h) #切回到原窗口
...
#注意:window_handles返回的是一个窗口句柄的列表,这些窗口句柄都有它所对应的索引号(编号)
#第一个打开的窗口的索引号是0,最后一个打开的窗口的索引号是1,倒数第二个是2,倒数第三个是3
#依次类推
# 0 1
# 0 2 1
# 0 3 2 1
# ……
操作frame/iframe框架里面的元素
#要操作框架里的元素,需要首先切到框架所在的页面
#通过框架的id或name切换
br.switch_to.frame("if") #这里id属性值为if
br.switch_to.frame("nf") #这里name属性值为nf
#还可以使用xpath,css定位
e=br.find_element_by_xpath("//*[@id='if']")
br.switch_to.frame(e)
切出frame/iframe框架
br.switch_to.default_content()
复选框操作
-
通过常用元素定位方式定位复选框元素,然后加click()操作
from selenium import webdriver br = webdriver.Firefox() #获取游览器对象 #定位复选框元素并单击 br.find_element_by_id("xxx").click() #通过ID定位元素单击 br.find_element_by_tag_name("input").click() #通过标签名定位元素单击 br.find_elements_by_tag_name("input")[0].click()#通过定位的元素数组单击 br.find_elements_by_tag_name("input").pop().click()#通过pop()获得数组最后一个元素单击
-
通过元素的type属性值判断是否为复选框
from selenium import webdriver br = webdriver.Firefox() es = br.find_elements_by_tag_name("input")#获取所有标签名为input的元素 for i in es: #checkbox表示复选框,radio表示单选框 if i.get_attribute("type")=="checkbox": i.click()
下拉框操作
使用Select类判断元素是否为下拉框,如果是,那么返回一个下拉框对象,如果不是,那么抛出异常
from selenium import webdriver
br = webdriver.Firefox()
s = Select(br.find_element_by_id("xxx"))#判断元素是否为下拉框
s.select_by_value("x") #1.通过value值定位下拉框中某一个选项
s.select_by_visible_text("x") #2.通过文本值定位下拉框中某一个选项
s.select_by_index(0) #3.通过下拉框中选项的索引值定位
s.options #获取到下拉框中所有的选项
for i in s.options: #通过循环获取每一个选项
i.click()
js弹窗处理
br.switch_to_alert.accept()#接受弹窗,表示点击弹窗上的确定按钮
br.switch_to_alert.dismiss()#取消弹窗,表示点击弹窗上的取消按钮
br.switch_to_alert.text #获取弹窗上的文本
js代码调用
js1 = "window.scrollTo(100,200);" #编写js代码
js2 = "window.open('https://www.baidu.com')"
br.excute_script(js1) #执行js代码
br.excute_script(js2)
鼠标事件
使用ActionChains类
from selenium import webdriver
from selenium.webdriver import ActionChains
br = webdriver.Firefox()
#perform()执行所有存储在ActionChains()类中的行为,做最终的提交
#鼠标悬停操作
ActionChains(br).move_to_element(br.find_element_by_id("xxx")).perform()
#鼠标双击操作
ActionChains(br).double_click(br.find_element_by_id("xxx")).perform()
#鼠标右击操作
ActionChains(br).context_click(br.find_element_by_id("xxx")).perform()
键盘操作
#send_keys()
e = br.find_element_by_id("input")
e.send_keys("xxx") #向文本框输入
使用Keys类,发送组合键盘按键
#需要先导入Keys类
from selenium.webdriver.common.keys import Keys
e = br.find_element_by_id("input")
e.send_keys(Keys.BACK_SPACE) #回退一格
e.send_keys(Keys.CONTROL,'a') #输入"control+a"即为全选
e.send_keys(Keys.CONTROL,'c') #输入"control+c"即为复制
e.send_keys(Keys.CONTROL,'v') #输入"control+v"即为粘贴
e.send_keys(Keys.CONTROL,'x') #输入"control+x"即为剪切
窗口截图
也就是网页截图
br.get_screenshot_as _file(r"D:\xxx\xxx\xxx.png")
#将截图保存在目标路径下
验证码处理
#9 验证码处理
# 常见的验证码处理方法:
# 1)去掉验证码
# 2)设置万能验证码
# 3)验证码识别技术
# 4)手工输入
#5)cookie:无效,因为cookie值会变,Seleniuim提供了get_cookie()来获取某个cookie值
#模拟万能验证码
from random import randint
#生成一个4位的随机数(模拟验证码的生成)
n=randint(1000,9999)
print(n)
#模拟用户输入验证码
num=int(input("请输入验证码:"))
print(num)
#模拟验证码的匹配:
if num==n:#模拟验证码输入更生成的匹配
print("认证成功")
elif num==1357:#莫i用户输入的是万能验证码
print("认证成功")
else:
print("认证失败")
Selenium脚本中可能出现的3种等待方法
为什么需要设置元素等待?
在我们做网页元素定位的时候,有可能出现网页打开了但是元素还没加载好,这个时候就定位不到元素,就会报错。为了避免这种情况,我们需要添加等待。
等待的分类
强制等待
sleep():sleep()可用于避免因为元素未加载而定位失败的情况,但是,如果指定的时间过长,即使元素加载好了,还是会继续等待,这样会浪费很多时间。在脚本调试过程中,sleep()用得比较多。
eg:sleep(10) 强制休眠10秒钟
隐式等待
implicitly_wait():隐式等待只需要声明一次,一般在打开浏览器后进行声明,声明之后对整个浏览器对象的声明周期都有效,后面不用再重复声明。隐式等待存在一个问题,就是程序会一直等待整个页面加载完成才会执行下一步,有时候想要定位的元素早就加载完成了,但是因为别的元素还没有,仍得到页面全部完成才执行下一步。
eg:implicitly_wait(10) 最多等10秒,抛出找不到元素的异常
显式等待
WebDriverWait():相比于隐式等待,显式等待只针对指定的元素生效,不再是针对所有的页面元素。可以根据需要定位的元素来设置显式等待,无需等待页面完全加载,从而可以节省因加载无关紧要的页面元素而浪费的时间。
eg:WebDriverWait(br,10,0.5).until():最多等10秒,如果超过10秒,抛出超时异常
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
br = webdriver.Firefox()
br.get("https://www.baidu.com")
#等待br,最多等待10秒,每0.5秒查看id属性为kw的元素是否加载完毕,如果加载完,那么结束等待,否则每隔0.5秒查看一次并等待
e = WebDriverWait(br,10,0.5).until(expected_conditions.presence_of_element_located((By.ID,'kw')))
e.send_keys('aaa')