Selenium模块虽然是一个web测试工具,但在爬虫中最有意思的功能就是可以模拟鼠标点击等操作。在前面的学习中,通过抓取button指向的地址模拟鼠标点击,但在selenium中直接模拟的即是点击的操作。
目录
调试
基本网页操作
通过属性定位标签
对标签的后续操作
模拟鼠标操作
补充
弹出的页面处理
等待页面加载
安装了selenium模块后,还要安装浏览器对应的驱动才可以使用selenium。chrome对应驱动为ChromeDriver,Firefox对应geckodriver,注意驱动的版本和浏览器的版本是否适配,把下载的驱动放到python安装目录的Scripts目录下。以下为初始化样例。
from selenium import webdriver # 初始化的参数中可以添加驱动的全地址,默认在scripts目录中 #driver = webdriver.Chrome('D:\Python\Scripts\chromedriver.exe') # 创建chrome浏览器对象 driver = webdriver.Firefox() # 创建firefox浏览器对象 driver.get('https://www.baidu.com') # 远程控制模式打开浏览器并访问百度
get() | 向指定URL发送请求 | maximize_window() | 最大化窗口 |
current_url() | 返回当前网页URL | get_cookies() | 获取当前网页的cookie |
name | 返回当前浏览器驱动的名称 | title | 返回当前网页的标题 |
page_source | 获取当前网页源码 | current_window_handle | 获取当前网页的窗口 |
window_handles | 获取当前打开的所有网页窗口 | refresh() | 刷新当前网页 |
quit() | 关闭网页并退出驱动 | close() | 关闭当前网页 |
back() | 返回上一页 |
函数中element代表返回满足条件的第一个标签,elements返回满足条件的所有标签
find_element_by_id() | 定位id | find_element_by_name() | 定位name |
find_element_by_class_name() | 定位class,用 - 连接calss的多个值 | find_element_by_tag_name() | 定位标签名 |
find_element_by_link_text() | 精确定位链接 | find_element_by_partial_link_text() | 模糊定位链接(懒惰) |
find_element_by_css_selector() | CSS选择器定位 | find_element_by_xpath() | XPath定位具体哪一个标签 |
为了方便使用,selenium中有一个By类封装了上述8种方法,只需调用find_element()或find_elements()传入两个参数即可。
from selenium import webdriver from selenimu.webdriver.common.by import By browser = webdriver.Firefox() browser.get('http://www.baidu.com') search1 = browser.find_element(By.ID, 'q') # 定位ID属性为q的标签
get_attribute('') | 获取标签中指定属性的值 | send_keys() | 标签赋值,可理解为输入框输入 |
is_selected() | 判断标签是否被选中 | tag_name() | 返回标签的名称 |
is_displayed() | 判断标签是否显示 | size | 返回标签大小 |
is_enabled() | 判断标签是否可用 | location | 返回标签位置坐标 |
text | 获取标签的文本内容 |
把实例化的WebDriver对象作为参数传入ActionChain对象进行实例化。ActionChain类中包含了鼠标的操作,调用这些操作函数后,操作传入一个队列中,通过调用perform()开始执行队列中的操作。通常定位好一个标签后再执行鼠标操作。【传入定位的元素作为参数】
点击类操作:
按压操作:
click_and_hold()长按按钮,然后time.sleep()指定等待时间,最后release()释放按钮
拖动和移动:
drag_and_drop(source,target)模拟鼠标拖动的动作,soure为起点即需要拖动的元素,target为重点即该元素区域去到的位置
drag_and_drop_by_offset(),给出水平和垂直方向上的位移量,模拟用鼠标把目标拖动一定距离
悬停:
move_to_element()指定在定位到的元素上悬停
在网页操作的时候,例如点击登录的按钮时,会弹出一个<iframe>标签的窗口用于输入登录信息。<iframe>标签作为嵌套的子页面也有自己的body等标签。需要switch_to_frame()跳转到这个新页面再进行标签定位。(通过定位iframe的属性确定标签)
time模块的sleep()方法提供了休眠等待的时间,但selenium模块提供了显示等待和隐式等待的方法。
显示等待【条件成立时再下一步操作】使用WebDriverWait类,传入WebDriver对象和超时时间,通过unti()l和until_not()判断条件,通过expected_conditions设置条件
from selenium import webdriver from selenium.webdirver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC browser = webdriver.Firefox() browser.get('http://www.taobao.com') element = WebDriverWait(driver=browser, timeout=5).until(EC.presence_of_element_located((By.ID, 'q'))) #在等待时间找有无ID为q的博标签,没有返回false
隐式等待【超时时间】implicitly_wait()指定超时等待时间