Selenium是一个用于网站应用程序自动化的工具。它可以直接运行在浏览器中,就像真正的用户在操作一样。它支持的浏览器包括IE、Mozilla Firefox、Safari、Google Chrome和Opera等,同时支持多种编程语言,如.Net、Java、Python和Ruby等。
安装
- 安装Selenium
pip install selenium
- 安装驱动
-
下载驱动
http://npm.taobao.org/mirrors/chromedriver/
要跟浏览器版本一致(如果浏览器版本太新,就下最新的也行)
-
将驱动放到文件同一路径下
-
使用
初始化
from selenium import webdriver
### 按照什么方式查找
from selenium.webdriver.common.by import By
### 得到一个谷歌浏览器对象
web = webdriver.Chrome('chromedriver.exe')
### 隐式等待:找一个控件,如果控件没有加载出来,等待5s中 等待所有,只需要写着一句,以后找所有控件都按这个操作来
web.implicitly_wait(10)
web.close() ###关闭
网页元素定位
-
find_element
- ID 和 NAME
web.find_element(By.ID,'idname') ###通过id查找 web.find_element(By.NAME,'name') ###通过name查找
通常情况下,一个网页中,元素的id或name的属性值是唯一的,如果多个元素的id或name相同,这种定位方式只能定位第一个元素。
- CLASS_NAME和TAG_NAME
web.find_element(By.CLASS_NAME,'classname') ###通过classname查找 web.find_element(By.TAG_NAME,'tagname') ###通过tagname查找
属性class的属性值可以被多个元素使用,同一个元素标签也可以多次使用,正因如此,这两种定位方式只能定位符合条件的第一个元素。
- LINK_TEXT和PARTIAL_LINK_TEXT
web.find_element(By.LINK_TEXT,'linktext') ###超链接载体的精确匹配 web.find_element(By.PARTIAL_LINK_TEXT,'partiallinktext') ###超链接载体的模糊匹配
若超链接载体并不是唯一的,那么Selenium也是默认定位第一个符合条件的元素。
- XPATH和CSS
web.find_element(By.XPATH,'xpath') ### xpath选择器 web.find_element(By.CSS_SELECTOR,'css') ###css选择器
两者是一个定位选择器,通过标签的路径来实现定位
-
find_elements
用法与find_element一致,查找到多个元素,结果为列表
网页元素操控
-
常规操作
常规操作包含文本清除、文本输入、单击元素、提交表单、获取元素值等- send_keys
web.find_element(By.NAME,"username").send_keys('username') ###通过name定位输入框,输入username
- clear
web.find_element(By.NAME,"username").clear() ###通过name定位输入框,清除输入内容
- text
web.find_element(By.XPATH,'//*[@id="post_list"]/article[1]/section/div/a').text ###通过xpath定位,获取文本
- click
web.find_element(By.NAME,"cookietime").click() ###通过name定位标签,点击
- submit
web.find_element(By.TAG_NAME,"button").submit() ###通过tag_name定位标签,提交
其中click和submit在某些情况下可以相互使用,submit只用于表单的提交按钮;click是强调事件的独立性,可用于任何按钮
- 鼠标事件操作
鼠标事件操作由Selenium的ActionChains类来实现
在调用它的时候,其实是不会立即执行,而是会将所有的操作按顺序存放在一个队列里,当你调用perform()方法时,才会按时间顺序会依次执行
- 鼠标右击和双击
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.action_chains import ActionChains import time web = webdriver.Chrome('chromedriver.exe') web.implicitly_wait(5) web.get('https://www.2345.com/') actions = ActionChains(web) ###拿到动作链对象 ele = web.find_element(By.LINK_TEXT,'凤凰网') actions.context_click(ele).perform() ###鼠标右击 actions.double_click(ele).perform() ###鼠标双击 time.sleep(5) web.close()
- 鼠标操作移动
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.action_chains import ActionChains import time web = webdriver.Chrome('chromedriver.exe') web.implicitly_wait(5) web.get('https://www.2345.com/') actions = ActionChains(web) ###拿到动作链对象 source = web.find_element(By.LINK_TEXT,'百度') ###定义原元素 target = web.find_element(By.LINK_TEXT,'凤凰网') ###定义目标元素 actions.drag_and_drop(source,target).perform() ###鼠标从source移动target web.close()
- 组合键简介
from selenium.webdriver.common.keys import Keys ### (根据字面命令解释如下:)先按下ctrl键,发送关键字"t",然后松开Ctrl键 actions.key_down(Keys.CONTROL).send_keys('t').key_up(Keys.CONTROL).perform() ###组合键,Ctrl+t 打开新网页
- 附录(ActionChains方法列表)
click(on_element=None) ——单击鼠标左键 click_and_hold(on_element=None) ——点击鼠标左键,不松开 context_click(on_element=None) ——点击鼠标右键 double_click(on_element=None) ——双击鼠标左键 drag_and_drop(source, target) ——拖拽到某个元素然后松开 drag_and_drop_by_offset(source, xoffset, yoffset) ——拖拽到某个坐标然后松开 key_down(value, element=None) ——按下某个键盘上的键 key_up(value, element=None) ——松开某个键 move_by_offset(xoffset, yoffset) ——鼠标从当前位置移动到某个坐标 move_to_element(to_element) ——鼠标移动到某个元素 move_to_element_with_offset(to_element, xoffset, yoffset) ——移动到距某个元素(左上角坐标)多少距离的位置 perform() ——执行链中的所有动作 release(on_element=None) ——在某个元素位置松开鼠标左键 send_keys(*keys_to_send) ——发送某个键到当前焦点的元素 send_keys_to_element(element, *keys_to_send) ——发送某个键到指定元素
浏览器常用操作
- 切换iframe
有时候查找元素报错,显示没有该元素,可以试试切换iframefrom selenium import webdriver from selenium.webdriver.common.by import By web.get('https://www.douban.com') web.switch_to.frame(web.find_element(By.TAG_NAME,'iframe')) ###找到tag为iframe,并切换到该iframe下 web.switch_to.parent_frame() ###切换回父iframe下 web.close()
- 获取cookies
web.add_cookie({}) ###添加cookies web.get_cookies() ###获得cookies
- 选项卡管理
- 前进
web.forward()
- 后退
web.back()
- 打开一个选项卡
web.execute_script('window.open()')
- 移动一个选项卡
web.switch_to.window(web.window_handles[1])
- 选项卡内容拉到最后
web.execute_script('window.scrollTo(0,document.body.offsetHeight)')