Selenium Python 提供了一个简单的API 便于我们使用 Selenium WebDriver编写 功能/验收测试。 通过Selenium Python的API,你可以直观地使用所有的 Selenium WebDriver 功能
Selenium Python提供了一个很方便的接口来驱动 Selenium WebDriver , 例如Firefox、Chrome、Ie,以及Remote,目前支持的python版本有2.7或3.2以上.
一开始Selenium是用来做一些自动化测试的,但是由于他的一些特性和爬虫相符,所以也可以用来写一些爬虫程序。
进入www.baidu.com
输入关键词,并搜索
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
driver_path = r'D:\chromedriver\chromedriver.exe' # chromedriver 路径
driver = webdriver.Chrome(executable_path=driver_path) # 设置 chromedriver 路径
driver.get("http://www.baidu.com") # 打开网址
elem = driver.find_element_by_id("kw") # 找元素名为 'wd' 的元素
driver.save_screenshot('screenshot.png') # 截图
elem.clear() # 输入之前先清空
elem.send_keys("pycon") # 输入
elem.send_keys(Keys.RETURN) # 按回车键
time.sleep(5)
driver.close() # 关闭当前标签页
from selenium import webdriver
from time import sleep
# 设置chromedriver路径
driver_path = r'D:\chromedriver\chromedriver.exe'
driver = webdriver.Chrome(executable_path=driver_path)
# 打开网页
driver.get('https://www.baidu.com')
# element是获取单个元素,elements是获取所有元素
# find_element_by_id:根据id来查找某个元素
# id = driver.find_element_by_id('kw')
# id.send_keys('id') # 在搜索框输入id
# find_element_by_name 根据 name 属性的值来查找元素
# name = driver.find_element_by_name('wd')
# name.send_keys('name') # 在搜索框输入name
# find_element_by_xpath 根据xpath语法来获取元素
# xpa = driver.find_element_by_xpath('//input[@name="wd"]')
# xpa.send_keys('xpath') # 在搜索框输入xpath
# find_element_by_class_name 根据类名定位
# cla = driver.find_element_by_class_name('s_ipt')
# cla.send_keys('class') # 在搜索框输入class
# find_element_by_tag_name 根据标签名定位
# tag = driver.find_element_by_tag_name('input')
# find_element_by_css_selector 根据 CSS 选择器定位
# cs = driver.find_element_by_css_selector('input.s_ipt')
# cs.send_keys('css') # 在搜索框输入css
from selenium import webdriver
from selenium.webdriver.support.ui import Select
from time import sleep
# 设置chromedriver路径
driver_path = r'D:\chromedriver\chromedriver.exe'
driver = webdriver.Chrome(executable_path=driver_path)
# 1. 操作输入框
# driver.get('http://www.baidu.com')
# elem = driver.find_element_by_name("wd") # 找元素名为 'wd' 的元素
# elem.clear() # 输入之前先清空
# elem.send_keys("python") # 输入
# sleep(5)
# driver.quit()
# 2. 操作checkbox ,就类似一些登陆的界面有个小方框记住密码,那个小方框就是checkbox
# 操作基本就是点击 使用这个即可checkbox.click()
# driver.get('https://www.douban.com/')
# checkbox = driver.find_element_by_name('remember')
# checkbox.click()
# 3. 操作下拉列表
# select = Select(driver.find_element_by_name('name')) #选中标签,使用Select创建对象
# select.selct_by_index(index) # 根据索引选择
# select.select_by_visible_text("text") # 根据可视文本选择
# select.select_by_value(value) # 根据值选择
# select.deselect_all() 取消所有选中项
有时候在页面的操作分为很多步,那么这时候可以使用鼠标行为链类ActionChains
来完成
ActionChains
可以完成简单的交互行为,例如鼠标移动,鼠标点击事件,键盘输入,以及内容菜单交互。 这对于模拟那些复杂的类似于鼠标悬停和拖拽行为很有用
当你在ActionChains
对象上调用行为方法时,这些行为会存储在 ActionChains
对象的一个队列里。 调用perform()
时,这些动作就以他们队列的顺序来触发
比如现在要将鼠标移动到某个元素上并执行点击时间,那么示例代码如下
示例代码:进入百度的页面,输入关键词并搜索
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from time import sleep
# 设置chromedriver路径
driver_path = r'D:\chromedriver\chromedriver.exe'
driver = webdriver.Chrome(executable_path=driver_path)
driver.get('https://www.baidu.com')
inputTag = driver.find_element_by_id("kw")
submitBtn = driver.find_element_by_id('su')
actions = ActionChains(driver)
actions.move_to_element(inputTag) # 鼠标移动到元素的指定位置
actions.send_keys_to_element(inputTag,'python') # 向指定的元素发送键
actions.move_to_element(submitBtn) # 鼠标移动到元素的指定位置
actions.click(submitBtn) # 鼠标单击
actions.perform() # 以他们队列的顺序来触发
# 补充几个常用的
# actions.click_and_hold() # 点击但不松开
# actions.context_click() # 右键点击
# actions.double_click() # 双击
# 设置cookie
# cookie = {'name':'foo','value':'bar'}
# driver.add_cookie(cookie)
# 获取所有cookie
# driver.get_cookies()
# 根据cookie的key获取value
# value = driver.get_cookie(key)
# 删除所有cookie:
# driver.delete_all_cookies()
# 删除某个cookie:
# driver.delete_cookie(key)
现在很多Web应用都在使用AJAX技术。浏览器载入一个页面时,页面内的元素可能是在不同的时间载入的, 这会加大定位元素的困难程度,因为元素不在DOM里,会抛出 ElementNotVisibleException
异常, 使用 waits
,我们就可以解决这个问题。Waiting给(页面)动作的执行提供了一些时间间隔-通常是 元素定位或者其他对元素的操作。
Selenium WebDriver
提供了两类 waits- 隐式和显式。显式的 waits 会让WebDriver在更深 一步的执行前等待一个确定的条件触发, 隐式的 waits 则会让WebDriver
试图定位元素的时候对DOM进行指定次数的轮询。
显式的waits
等待一个确定的条件触发然后才进行更深一步的执行。 最糟糕的的做法是time.sleep()
,这指定的条件是等待一个指定的时间段。 这里提供一些便利的方法让你编写的代码只等待需要的时间,WebDriverWait
结合 ExpectedCondition
是一种实现的方法:
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
# 设置chromedriver路径
driver_path = r'D:\chromedriver\chromedriver.exe'
driver = webdriver.Chrome(executable_path=driver_path)
# 打开某个网址
driver.get("http://somedomain/url_that_delay_loading")
try:
element = WebDriverWait(driver,10).until(
EC.presence_of_element_located((By.ID,"myDynamicElement"))
) # 最多等待10s,10s内加载出来就往下走,没加载出来就不等了
finally:
driver.quit()
当我们要找一个或者一些不能立即可用的元素的时候,隐式waits
会先等待一段时间
from selenium import webdriver
# 设置chromedriver路径
driver_path = r'D:\chromedriver\chromedriver.exe'
driver = webdriver.Chrome(executable_path=driver_path)
driver.get("http://somedomain/url_that_delays_loading")
driver.implicitly_wait(10) # 设置隐式等待10s
myDynamicElement = driver.find_element_by_id('myDynamicElement')
from selenium import webdriver
# 设置chromedriver路径
driver_path = r'D:\chromedriver\chromedriver.exe'
driver = webdriver.Chrome(executable_path=driver_path)
driver.get('https://www.baidu.com')
driver.execute_script("window.open('https://www.bilibili.com/')") # 开启另一个标签页
print(driver.current_url)
# 虽然开启了新的标签页,但是driver还是停留在之前的页面,需要把driver切到新的标签页
# switch_to_window(self, window_name)这个被舍弃了 推荐用switch_to.window(self, window_name)
driver.switch_to.window(driver.window_handles[1]) # 切换标签页
print(driver.current_url)
运行结果
这里可以看到我们开启了新的标签页 但是输出当前url还是输出的是https://www.baidu.com/
所以证明 我们开启新的标签页,但是并没有切换过去标签页,而只是开启了。所以需要切换这是就需要用到窗口句柄driver.window_handles[1]
。
from selenium import webdriver
driver_path = r'D:\chromedriver\chromedriver.exe'
# 添加chrome参数
options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=http://119.101.126.3:9999")
driver = webdriver.Chrome(executable_path=driver_path,options= options)
# 打开网页
driver.get('http://httpbin.org/ip')
参考文档: