Selenium 简介
Selenium 是一个 Web 的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是 Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器(包括 PhantomJS 这些无界面的浏览器)。
Selenium 可以根据我们的指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作是否发生。
Selenium 自己不带浏览器,不支持浏览器的功能,它需要与第三方浏览器结合在一起才能使用。
先下载 selenium webdriver geckodriver.exe
,下载好后放到 python 目录里面。
Firefox 的目录也要添加到环境变量中。
Selenium 库里有个叫 WebDriver 的 API。WebDriver 有点儿像可以加载网站的浏览器,但是它也可以像 BeautifulSoup 或者其他 Selector 对象一样用来查找页面元素,与页面上的元素进行交互(发送文本、点击等),以及执行其他动作来运行网络爬虫。
Selenium 快速入门
# -*- coding:utf-8 -*- from selenium import webdriver # 要想调用键盘按键操作需要引入 keys 包 from selenium.webdriver.common.keys import Keys # 创建浏览器对象 driver = webdriver.Firefox() driver.get("http://www.baidu.com") # 打印页面标题“百度一下你就知道” print(driver.title) # 生成当前页面快照 driver.save_screenshot("baidu.png") # 是百度搜索框,输入字符串“微博”,跳转到搜索页面 driver.find_element_by_id("kw").send_keys(u"微博") # 是百度搜索按钮,click() 是模拟点击 driver.find_element_by_id("su").click() # 获取新的页面快照 driver.save_screenshot(u"screenshot.png") # 打印网页渲染后的源代码 print(driver.page_source) # 获取当前页面 Cookie print(driver.get_cookies()) # ctrl+a 全选输入框内容 driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'a') # ctrl+x 剪切输入框内容 driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'x') # 输入框重新输入内容 driver.find_element_by_id("kw").send_keys("test") # 模拟 Enter 回车键 driver.find_element_by_id("su").send_keys(Keys.RETURN) # 清除输入框内容 driver.find_element_by_id("kw").clear() # 生成新的页面快照 driver.save_screenshot("test.png") # 获取当前 url print(driver.current_url) # 关闭当前页面,如果只有一个页面,会关闭浏览器 driver.close() # 关闭浏览器 driver.quit()
1、页面操作
假如有下面的输入框:
<input type="text" name="user-name" id="passwd-id" />
查找方法如下:
# 获取 id 标签值 element = driver.find_element_by_id("passwd-id") # 获取 name 标签值 element = driver.find_element_by_name("user-name") # 获取标签名值 element = driver.find_elements_by_tag_name("input") # 也可以通过 XPath 来匹配 element = driver.find_element_by_xpath("//input[@]")
2、定位元素
# 通过 Id 定位目标元素 driver.find_element_by_id('i1') # 通过 className 定位目标元素,返回一个对象 driver.find_element_by_class_name('c1') # 通过 name 属性定位目标元素,返回一个对象 driver.find_element_by_name('n1') # 通过 Xpath 定位目标元素,返回一个对象 driver.find_element_by_xpath('//*[@id="i1"]') # 通过 css Selector 定位目标元素,返回一个对象 driver.find_element_by_css_selector('#i1') # 通过标签名称定位,返回一个对象 driver.find_element_by_tag_name('input') # 通过标签中的文本查找元素,返回一个对象 driver.find_element_by_link_text('登录')
一次查找多个元素(这些方法会返回一个 list 列表):
# 通过 className 定位目标元素,返回一个集合 driver.find_elements_by_class_name('c1') # 通过 name 属性定位目标元素,返回一个集合 driver.find_elements_by_name('n1') # 通过 Xpath 定位目标元素,返回一个集合 driver.find_elements_by_xpath('//*[@id="i1"]') # 通过 Css Selector 定位目标元素,返回一个集合 driver.find_elements_by_css_selector('#i1') # 通过标签名称定位,返回一个集合 driver.find_elements_by_tag_name('input') # 通过标签中的文本查找元素,返回一个集合 driver.find_element_by_link_text('登录') # 通过标签中文本的模糊匹配查找,返回一个集合 find_elements_by_partial_link_text("订单")
3、鼠标动作
# -*- coding:utf-8 -*- from selenium import webdriver # 要想调用键盘按键操作需要引入 keys 包 from selenium.webdriver.common.keys import Keys from selenium.webdriver import ActionChains # 创建浏览器对象 driver = webdriver.Firefox() # 打开页面 driver.get("http://www.baidu.com") # 鼠标移动到某处 action1 = driver.find_element_by_id("su") ActionChains(driver).move_to_element(action1).perform() # 鼠标移动到某处单击 action2 = driver.find_element_by_id("su") ActionChains(driver).move_to_element(action2).click(action2).perform() # 鼠标移动到某处双击 action3 = driver.find_element_by_id("su") ActionChains(driver).move_to_element(action3).double_click(action3).perform() # 鼠标移动到某处右击 action4 = driver.find_element_by_id("su") ActionChains(driver).move_to_element(action4).context_click(action4).perform()
4、Select 表单
# 导入 Select 类 from selenium.webdriver.support.ui import Select # 找到 name 的选项卡 select = Select(driver.find_element_by_name('status')) select.select_by_index(1) select.select_by_value("0") select.select_by_visible_text(u"xxx")
以上是三种选择下拉框的方式,它可以根据索引来选择,可以根据值来选择,可以根据文字来选择。注意:
index 索引从 0 开始
value 是 option 标签的一个属性值,并不是显示在下拉框中的值
visible_text 是在 option 标签文本的值,是显示在下拉框的值
全部取消方法
select.deselect_all()
5、弹窗处理
当页面出现了弹窗提示:
alert = driver.switch_to_alert()
6、页面切换
一个浏览器肯定会有很多窗口,所以我们肯定要有方法来实现窗口的切换。切换窗口的方法如下:
driver.switch_to.window("this is window name")
7、页面前进和后退
driver.forward() #前进 driver.back() # 后退
8、模拟登陆豆瓣网站
# -*- coding:utf-8 -*- from selenium import webdriver from selenium.webdriver.common.keys import Keys import time driver = webdriver.Firefox() driver.get("http://www.douban.com") # 输入账号密码 driver.find_element_by_name("form_email").send_keys("158xxxxxxxx") driver.find_element_by_name("form_password").send_keys("zhxxxxxxxx") # 模拟点击登录 driver.find_element_by_xpath("//input[@]").click() # 等待3秒 time.sleep(3) # 生成登陆后快照 driver.save_screenshot(u"douban.png") driver.quit()
以上就是 Selenium 的一些常用方法。