1. 环境安装
使用selenium 需要下载浏览器相应的
webdriver
驱动程序,注意下载的驱动版本一定要匹配浏览器版本。- Firefox浏览器驱动:geckodriver
- Chrome浏览器驱动:chromedriver
- IE浏览器驱动:IEDriverServer
- Edge浏览器驱动:MicrosoftWebDriver
- Opera浏览器驱动:operadriver
1.1 自动化安装驱动
例子为谷歌浏览器
from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager driver = webdriver.Chrome(ChromeDriverManager.install())
2. selenium页面加载等待
共有四种方式等待
2.1 time.sleep()等待
2.2 implicitly_wait设置最长等待时间
在给定时间内页面加载完成或者已经超时,才会执行下一步
注意使用
implicitly_wait
只需设置一次,且对整个driver
生命周期都起作用,凡是遇到页面正在加载都会阻塞声明方式如下
driver.implicitly_wait(30)
2.3 使用WebDriverWait设置等待条件
能够更加精确灵活地设置等待时间>>>>>可在设定时间内每隔一段时间检测是否满足某个条件,如果满足条件则进行下一步操作,如果超过设置时间还不满足,则抛出
TimeoutException
异常声明方式如下
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None) # driver:浏览器驱动 # timeout:最长超时时间,默认以秒为单位 # poll_frequency:检测的间隔(步长)时间,默认为0.5秒 # gnored_exceptions:忽略的异常,即使在调用until()或until_not()的过程中抛出给定异常也不中断
一般配合
until()
或until_not()
方法使用,表示等待阻塞直到返回值为True
或者False
,需要注意这两个方法的参数都需是可调用对象,即方法名称,可以使用expected_conditions
模块中的方法或者自己封装的方法。1. 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个元素存在,这个方法就返回True
text_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进去,否则返回False
invisibility_of_element_located
: 判断某个元素中是否不存在于dom树或不可见
element_to_be_clickable
: 判断某个元素中是否可见并且是enable的,这样的话才叫clickable
staleness_of
: 等某个元素从dom树中移除,注意,这个方法也是返回True或False
element_to_be_selected
: 判断某个元素是否被选中了,一般用在下拉列表
element_selection_state_to_be
: 判断某个元素的选中状态是否符合预期
element_located_selection_state_to_be
: 跟上面的方法作用一样,只是上面的方法传入定位到的element,而这个方法传入locator
例子:
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(expected_conditions.visibility_of_element_located((By.ID, 'su'))) # 判断元素是否可见,如果可见就返回这个元素 WebDriverWait(driver,10).until(expected_conditions.visibility_of(driver.find_element(by=By.ID, value='kw')))
2.4 检测document是否加载完成
使用如下代码检测是否加载成功
driver.execute_script('return document.readyState;') == 'complete'
3. selenium交互控制
3.1 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)
: 在某个元素位置松开鼠标左键
3.2 模拟鼠标事件
模拟鼠标移动,点击,拖拽
action_chains = ActionChains(driver)
action_chains.move_to_element(target).click(target).perform()
移动鼠标到指定元素然后点击
target.click()
直接调用元素的点击
action_chains.move_by_offset(10, 50).perform()
鼠标移动到(10, 50)坐标处
action_chains.move_to_element_with_offset(target, 10, 50).perform()
鼠标移动到距离元素target(10, 50)处
action.drag_and_drop(dragger, target).perform()
鼠标拖拽,将一个元素拖动到另一个元素
- 使用点击 -> 移动来实现拖拽
action.click_and_hold(dragger).release(target).perform() time.sleep(2) action.click_and_hold(dragger).move_to_element(target).release().perform()
4. 模拟键盘输入
通过
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)
: 键盘 F1
send_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)
5. 警告框处理
用于处理调用
alert
弹出的警告框。driver.switch_to_alert()
: 切换到警告框
text
:返回alert/confirm/prompt
中的文字信息,比如js调用alert('failed')
则会获取failed
字符串
accept()
:接受现有警告框
dismiss()
:关闭现有警告框
send_keys(keysToSend)
:将文本发送至警告框
6. 使用JS打开新的标签页窗口(用一个driver)
driver.execute_script(f'window.open("https://www.baidu.cn", "_blank");')
调用switch_to.window手动切换window
焦到新打开的tab页面,然后关闭
driver.switch_to.window(driver.window_handles[1]) time.sleep(2) driver.close()
手动回到原来的tab页面
driver.switch_to.window(driver.window_handles[0])
还可以使用模拟打开新tab页按键的方式
>>>>>>>>>>>>
from selenium import webdriver from selenium.webdriver import Keys, ActionChains from selenium.webdriver.common.by import By driver = webdriver.Chrome() 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()
7. 其他常用的使用方法
driver.current_url
: 获取当前活动窗口的url
driver.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脚本