准备工作
安装selenium
可以用pip install selenium
也可以在pycharm中安装
下载浏览器驱动
需要把浏览器驱动放入系统路径中,或者直接告知selenuim的驱动路径
使用Selenium
1.打开驱动
driver = webdriver.Chrome(executable_path="driver/chromedriver.exe") # 谷歌浏览器,可以传入一个指定路径
#driver = webdriver.Chrome("driver/chromedriver.exe")
#driver = webdriver.Chrome()
2.加载网页
driver.get(url) # 打开url网页 比如 driver.get("http://www.baidu.com")
3.元素定位
定位的作用是找到目标位置,你可以对这个元素执行点击,输入等操作,就是页面交互,以前是要找到这些元素。
在element变成elements就是找所有满足的条件,返回数组。
driver.find_element_by_id()
driver.find_element_by_name()
driver.find_element_by_class_name()
driver.find_element_by_tag_name()
driver.find_element_by_link_text()
driver.find_element_by_partial_link_text()
driver.find_element_by_xpath()
driver.find_element_by_css_selector()
4.获取内容
浏览器加载出页面后,用这个属性就能获得加载后的全部html文件
driver.page_source #获取加载js后的页面html
driver.current_url #获取当前页面url
driver.title #获取当前页面的标题
5.控制浏览器操作
driver.set_window_size(480, 800) #控制浏览器窗口大小
driver.back() #后退
driver.forward() #前进
driver.refresh() # 刷新
6.页面元素常用操作
webelement = driver.find_element_by_id("ID")
webelement.send_keys("asdffgghjkl") #模拟按键输入
webelement.clear() #清除文本
webelement.click() #单击元素
webelement.submit()#可以在搜索框模拟回车操作
webelement.size #获得元素的大小
webelement.text #获得元素的文本
webelement.get_attribute("name") #获取元素的某个属性
webelement.is_displayed() #设置该元素是否用户可见
7.鼠标操作
在 WebDriver 中, 将这些关于鼠标操作的方法封装在 ActionChains 类提供
- perform(): 执行所有 ActionChains 中存储的行为;
- context_click(): 右击;
- double_click(): 双击;
- drag_and_drop(): 拖动;
- move_to_element(): 鼠标悬停。
```python
from selenium import webdriver
引入 ActionChains 类
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome() driver.get(“https://www.baidu.cn“)
定位到要悬停的元素
above = driver.find_element_by_link_text(“设置”)
对定位到的元素执行鼠标悬停操作
ActionChains(driver).move_to_element(above).perform()
<a name="eljZn"></a>
## 8.键盘事件
- send_keys(Keys.BACK_SPACE) 删除键(BackSpace)
- send_keys(Keys.SPACE) 空格键(Space)
- send_keys(Keys.TAB) 制表键(Tab)
- send_keys(Keys.ESCAPE) 回退键(Esc)
- send_keys(Keys.ENTER) 回车键(Enter)
- send_keys(Keys.CONTROL,'a') 全选(Ctrl+A)
- send_keys(Keys.CONTROL,'c') 复制(Ctrl+C)
- send_keys(Keys.CONTROL,'x') 剪切(Ctrl+X)
- send_keys(Keys.CONTROL,'v') 粘贴(Ctrl+V)
- send_keys(Keys.F1) 键盘 F1
- ……
- send_keys(Keys.F12) 键盘 F12
```python
from selenium.webdriver import Keys
webelement.send_keys(Keys.ENTER) #通过Keys这个类来模拟键盘输入,Keys在上面的from导入
9.等待页面加载完成
如果页面用到特别多的ajax的话,程序不知道什么时候加载完成。需要等待页面渲染完成
显示等待
显式等待使WebdDriver等待某个条件成立时继续执行,否则在达到最大时长时抛出超时异常(TimeoutException)。
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
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
element = WebDriverWait(driver, 5, 0.5).until(EC.presence_of_element_located((By.ID, "kw")))
element.send_keys('selenium')
driver.quit()
WebDriverWait类是由WebDirver 提供的等待方法。在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常。具体格式如下:WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
- driver :浏览器驱动。
- timeout :最长超时时间,默认以秒为单位。
- poll_frequency :检测的间隔(步长)时间,默认为0.5S。
- ignored_exceptions :超时后的异常信息,默认情况下抛NoSuchElementException异常。
- WebDriverWait()一般由until()或until_not()方法配合使用,下面是until()和until_not()方法的说明。
- until(method, message=‘’) 调用该方法提供的驱动程序作为一个参数,直到返回值为True。
- until_not(method, message=‘’) 调用该方法提供的驱动程序作为一个参数,直到返回值为False。
在本例中,通过as关键字将expected_conditions 重命名为EC,并调用presence_of_element_located()方法判断元素是否存在。
隐式等待
在访问页面开始就设置一个时间,假设设置10秒,程序会等页面加载10秒,如果10秒内加载出来了,就开始抓取,如果10秒还没加载出来,直接就开始抓,可能就异常了
from selenium import webdriver
driver = webdriver.Firefox()
driver.implicitly_wait(10) # 秒
driver.get("http://www.baidu.com")
10.在不同的窗口或者框架之间移动
driver.switch_to.window("windowName")
driver.switch_to.frame("frameName")
#先通过xpth定位到iframe
xf = driver.find_element_by_xpath('//*[@id="x-URS-iframe"]')
#再将定位对象传给switch_to_frame()方法
driver.switch_to_frame(xf)
一旦我们完成了frame中的工作,我们可以这样返回父frame:
driver.switch_to_default_content()
11.警告框处理
alert = driver.switch_to.alert #切换到页面的警告框
alert.text #返回 alert/confirm/prompt 中的文字信息
alert.accept() #接受现有警告框
alert.dismiss() #解散现有警告框
alert.send_keys() #发送文本至警告框
12.下拉框选择
from selenium import webdriver
from selenium.webdriver.support.select import Select
from time import sleep
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get('http://www.baidu.com')
sel = driver.find_element_by_xpath("//select[@id='nr']")
Select(sel).select_by_value('50') # 显示50条
13.文件上传
driver.find_element_by_name("file").send_keys('D:\\upload_file.txt') # # 定位上传按钮,添加本地文件
14.cookie操作
driver.get_cookie() #获得所有cookie信息
driver.get_cookie(name) #返回字典的key为“name”的cookie信息
driver.add_cookie(cookie_dict) #添加cookie。“cookie_dict”指字典对象,必须有name 和value 值
driver.delete_cookie(name,optionsString) #删除cookie信息。“name”是要删除的cookie的名称,“optionsString”是该cookie的选项,目前支持的选项包括“路径”,“域”
driver.delete_all_cookies() #删除所有cookie信息
15.调用JavaScript代码
js="window.scrollTo(100,450);" #一段js代码
driver.execute_script(js) # 通过javascript设置浏览器窗口的滚动条位置
16.关闭浏览器
driver.close() #关闭单个窗口
driver.quit() #关闭所有窗口