这里之讲解用法,安装配置就不详细讲解了。我比较喜欢的浏览器驱动是ChromeDriver和无界面的PhantomJS。css
用下面的代码初始化浏览器java
from selenium import webdriver # 把浏览器对象赋值为browser对象,而后就能够进行模拟浏览器操做 browser = webdriver.Chrome()
browser.get('url地址') # 这个是打印网页源代码 print(browser.page_source) browser.close() # 处理完后要关闭这个对象
咱们要想执行某个操做,好比填充表单,模拟点击等,或者向某个输入框输入文字,首先要知道位置,而selenium提供了一系列的查找节点的方法,以下。python
查找方法 | 说明 |
---|---|
find_element_by_id | 经过id来查找标签 |
find_element_by_name | 经过name属性来查找标签 |
find_element_by_xpath | 经过xpath来查找标签 |
find_element_by_link_text | 经过连接的文字来查找标签 |
find_element_by_partial_link_text | 经过连接的关键字来查找标签 |
find_element_by_tag_name | 经过标签名来查找标签 |
find_element_by_class_name | 经过class的属性来查找标签 |
find_element_by_css_selector | 经过css选择器来查找标签 |
还有一种通用方法是find_element()传两个参数,一个是By.查找方式,一个是值,好比find_element(By.ID,id)和find_element_by_id结果一致。web
查找多个节点的时候,直接在查找单个节点的方法中加上s,如find_elements_by_name或者find_elements(By.NAME,name),列表中的每个节点都是WebElement类型。ajax
selenium能够驱动浏览器执行一些操做,就是让浏览器模拟执行一些动做。下面是一些常见方法总结。windows
方法 | 说明 |
---|---|
send_keys | 输入文字 |
clear | 清空文字 |
click | 点击按钮 |
有一些交互操做没有特定的执行对象,好比鼠标拖曳,键盘按键等,这些相对复杂的动做用动做链的方式执行。这里暂时用不到,先略过。浏览器
用execute_script()方法能够模拟运行JavaScript,基本上全部复杂的动做均可以用执行JavaScript的方式来实现。cookie
用 get_attribute() 方法来获取节点的属性。
用 text 属性来获取节点的文本值。
用 id 属性来获取节点id。
用 location 属性来获取节点在页面中的相对位置。
用 tag_name 属性来获取标签名称。
用 size 属性来获取节点的大小。网络
网页有一种节点是iframe,也就是子Frame,至关于页面的子页面。网页打开的时候,默认是在父级Frame里面进行操做,要获取子Frame的节点,须要用到switch_to.frame()方法进行切换。
用switch_to.parent_frame()能够获取到父页面的内容。
在selenium中,get()方法会在网页框架加载完成后结束执行,此时若是获取网页源码,可能并非浏览器彻底加载的页面,若是有额外的ajax请求,网页源代码也不必定能成功获取,须要延时等待必定时间,确保 动态网页源代码 所有加载出来。
等待方式有两种,一种是隐式等待,一种是显式等待。
隐式等待就是通常的等待,在执行测试的时候,先等待完以后,再进行接下来的步骤,用implicitly_wait(),参数是时间。
隐式等待的效果并无那么好,只是规定了一个固定的时间,而网页的加载时间会受到网络条件的影响。
这里有一个显式等待的方法就是指定要查找的节点,而后指定一个最长等待时间,在规定的时间内加载出来就返回,加载不出来,则抛出异常。
示例以下:
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 as EC browser = webdriver.Chrome() browser.get('url地址') # 先指定最长等待时间为20s wait = WebDriverWait(browser,20) # 传入等待条件expected_conditions,这里的presence_of_element_located表明节点出现的意思 input = wait.until(EC.presence_of_element_located(By.ID,'a')) # 按钮等待条件,这里的element_to_be_clickable表示可点击的,10秒内能点击,就成功 button = wait.until(EC.element_to_be_clickable(By.CSS_SELECTOR,'.btn-ss')) print(input,button)
下面是 全部的等待条件 :
等待条件 | 说明 |
---|---|
title_is | 标题是某内容 |
title_contains | 标题包含某内容 |
presence_of_all_elements_located | 某个节点是否加载出来 |
visibility_of_element_located | 某个节点是否可见 |
visibility_of | 某个节点是否可见,传入节点对象 |
presence_of_all_elements_located | 全部节点加载出来 |
text_to_be_present_in_element | 某个节点文本包含某文字 |
text_to_be_present_in_element_value | 某个节点值包含某文字 |
frame_to_be_available_and_switch_to_it | 加载并切换 |
invisibility_of_element_located | 节点不可见 |
element_to_be_clickable | 节点可点击 |
staleness_of | 判断一个节点是否存在DOM,可判断页面是否已刷新 |
element_to_be_selected | 节点可选择,传入节点对象 |
element_located_to_be_selected | 节点可选择,传入定位元组 |
element_selection_state_to_be | 传入节点对象以及状态,相等返回True,不然返回False |
element_located_selection_state_to_be | 传入定位元组以及状态,相等返回True,不然返回False |
alert_is_present | 是否出现警告 |
selenium测试用back()方法后退,用forward()方法前进。
使用selenium能够方便地对Cookies进行操做。
用get_cookies()方法获取全部的Cookies。
用add_cookies()方法增长Cookies。
用delete_all_cookies()和delete_cookies()方法删除Cookies。
在访问网页的时候,会开启一个个选项卡,在selenium中也能够对选项卡进行操做。
browser.execute_script('windows.open()') print(window_handles) browser.switch_to_window(browser.window_handles[1])
用execute_script方法执行JavaScript语句,这里的window_handles获取当前开启的全部选项卡,返回的是选项卡的代号列表。用browser.window_handles[index]便可以跳转到index索引对应的选项卡。
捕获异常是常常要用到的方法,语句是try-except-finally,对于不一样的错误,不管是网络链接,代码运行时间超时,仍是数据未找到,都十分有用。