1. selenium 的简介
- selenium 最开始是 web 的自动化测试工具,最开始网站自动化测试开发的,selenium 可以直接运行在浏览器上,它支持所有的主流浏览器,可以接受指令让浏览器自动加载界面,获取需要的数据,甚至还可以截屏。
- Chromedriver 是一个驱动chrome 浏览器的驱动程序,使用它才可以驱动浏览器。当然,针对不同的浏览器有不同的版本的 driver。
- 淘宝镜像:https://npm.taobao.org/
- 安装总结: https://www.jianshu.com/p/a383e8970135
- selenium 的安装:pip install selenium
2. selenium 的快速入门
# 实例化浏览器
driver = webdriver.Chrome()
# 发送请求
driver.get('https://www.baidu.com')
# 退出浏览器
driver.quit()
在这里插入代码片
3. 定位元素
- find_element_by_id : 根据 id 来查找某个元素
- driver.find_element_by_id(‘kw’)
- driver.find_element_by_id(‘su’)
- find_element_by_class_name : 根据类名查找元素
- driver.find_element_by_class_name(‘s_ipt’)
- driver.find_element_by_id(‘su’)
- find_element_by_xpath : 根据xpath语法来获取元素
- driver.find_element_by_xpath(’//input[@id=“kw”]’)
- driver.find_element_by_id(‘su’)
- find_element_tag_name : 根据标签名来查找元素
- driver.find_element_by_tag_name(‘div’)
- driver.find_element(By.TAG_NAME,‘div’)
- find_element_by_css_selector : 根据css 选择器选取元素
- driver.find_element_by_css_selector(’#kw’)
- driver.find_element_by_css_selector(’.s_ipt’)
- driver.find_element_by_id(‘su’)
4. 操作表单元素
4.1 操作输入框:分为两步
- 找到输入框
- 使用 send_keys(values),将内容输入到输入框里面去
- 使用clear() 可以清楚输入框的内容
Tag.clear()
4.2 操作checkbox
- 因为要选中checkBox标签是需要点击的。因此需要使用此标签,需要先找到此标签,然后执行 click()命令
- rememberTag = driver.find_element_by_name(“rememberMe”)
- rememberTag.click()
4.3 操作按钮
- 操作按钮有很多种方式,例如: 单击、双击、右击等。使用单击,直接调用click()函数就可以了。
- inputTag = driver.find_element_by_id(‘su’)
- inputTag.click()
4.3 选择 select
- select 元素不能直接点击,因为点击后还要选择元素。所有,selenium 专门为 select 标签提供一个类 selenium.webdriver.support.ui import Select 将获取到的元素传到这个类中,创建这个对象。以后使用这对对象进行选择。https://www.17sucai.com/boards/53562.html
- 实例:
from selenium import webdriver
# 对表单元素(下拉表单)进行选择的时候,需要导入以下的模块
from selenium.webdriver.support.ui import Select
# 实例化一个浏览器
driver = webdriver.Chrome()
driver.get('https://www.17sucai.com/pins/demo-show?id=5926')
# 切换ifame
iframe = driver.find_element_by_id('iframe')
driver.switch_to_frame('iframe')
# 将找到的下拉表单用Select进行包裹,然后根据select模块找到下拉表单中的内容
Select(driver.find_element_by_class_name('nojs')).select_by_value('JP')
# Select(driver.find_element_by_class_name('nojs')).select_by_index()
5. 行为链
- 有时候在⻚⾯中的操作可能要有很多步,那么这时候可以使⽤⿏标⾏为链类 ActionChains来完成。⽐如现在要将⿏标移动到某个元素上并执⾏点击事件
# 行为链操作
# 有时候在⻚⾯中的操作可能要有很多步,那么这时候可以使⽤⿏标⾏为链类ActionChains来完成。
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time
# 实例化一个浏览器
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
# 找到搜索框
inputTag = driver.find_element_by_id('kw')
# 找到确认按钮
submitTag = driver.find_element_by_id('su')
# ⽐如现在要将⿏标移动到某个元素上
actions = ActionChains(driver)
# 鼠标移动到元素中间(输入框)
actions.move_to_element(inputTag)
# 将键发送到元素
actions.send_keys_to_element(inputTag, 'java')
# 鼠标移动到元素中间(确认按钮)
actions.move_to_element(submitTag)
# 鼠标单击(左键)
actions.click(submitTag)
# 执行所有存储的操作,该步骤必须有,否则构不成完整的行为
actions.perform()
- 还有更多的⿏标相关的操作
- click_and_hold(element):点击但不松开⿏标。
- context_click(element):右键点击。
- double_click(element):双击。
- 更多⽅法请参考:http://selenium-python.readthedocs.io/api.html
6. 打开多窗口和切换页面
- 有时候窗⼝中有很多⼦tab⻚⾯。这时候肯定是需要进⾏切换的。selenium 提供了⼀个叫做 switch_to_window 来进⾏切换,具体切换到哪个⻚⾯,可以 从 driver.window_handles 中找到
from selenium import webdriver
# 实例化浏览器
driver = webdriver.Chrome()
# 发送链接请求
# url1 = driver.get('https://www.baidu.com/')
url2 = driver.get('https://www.douban.com/')
# 打开新的页面
driver.execute_script('window.open("https://www.baidu.com/")')
# 切换到新页面
driver.switch_to.window(driver.window_handles[0])
# driver.switch_to_window(driver.window_handles[0])
# 根据你当前所在的页面进行关闭
driver.close()
7. 显式等待和隐式等待
现在的⽹⻚越来越多采⽤了 Ajax 技术,这样程序便不能确定何时某个元素完全 加载出来了。如果实际⻚⾯等待时间过⻓导致某个dom元素还没出来,但是你 的代码直接使⽤了这个WebElement,那么就会抛出NullPointer的异常。为了 解决这个问题。所以 Selenium 提供了两种等待⽅式:⼀种是隐式等待、⼀种 是显式等待
-
隐式等待:调⽤ driver.implicitly_wait。那么在获取不可⽤的元素之前,会 先等待10秒中的时间
-
显示等待:显示等待是表明某个条件成⽴后才执⾏获取元素的操作。也可以 在等待的时候指定⼀个最⼤的时间,如果超过这个时间那么就抛出⼀个异 常。显示等待应该使⽤selenium.webdriver.support.excepted_conditions 期望的条件和selenium.webdriver.support.ui.WebDriverWait来配合完成
from selenium import webdriver
2 from selenium.webdriver.common.by import By
3 from selenium.webdriver.support.ui import WebDriverWait
4 from selenium.webdriver.support import expected_conditions as EC
5
6 driver = webdriver.Chrome()
7 driver.get(“https://www.baidu.com/”)
8
9 try:
10 element = WebDriverWait(driver, 10).until(
11 EC.presence_of_element_located((By.ID, “myDynamicElement”))
12 )
13 finally:
14 driver.quit()
- ⼀些其他的等待条件
- presence_of_element_located:某个元素已经加载完毕了。
- presence_of_all_elements_located:⽹⻚中所有满⾜条件的元素都加载完 毕了。
- element_to_be_clickable:某个元素是可以点击了。