selenium介绍:
-
selenium是一个web的自动化测试工具,最初是为网站自动化测试而开发的,selenium可以直接运行在浏览器上,它支持所有主流的浏览器,可以接收指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏
-
chromedriver是一个驱动Chrome浏览器的驱动程序,使用他才可以驱动浏览器。当然针对不同的浏览器有不同的driver。以下列出了不同浏览器及其对应的driver:
-
下载chromedriver
-
百度搜索:淘宝镜像(npmmirror 镜像站)
-
下载地址:CNPM Binaries Mirror
-
-
安装
Selenium
:pip install selenium
Selenium快速入门:
from selenium import webdriver
# 实例化浏览器
driver = webdriver.Chrome()
# 发送请求
driver.get('https://www.baidu.com')
# 退出浏览器
driver.quit()
driver定位元素:
- 通过id值进行定位 driver.find_element(By.ID,"kw")
- 通过class值进行定位 driver.find_element(By.CLASS_NAME,"s_ipt")
- 通过name进行定位 driver.find_element(By.NAME,"wd")
- 通过tag_name 进行定位 driver.find_elements(By.TAG_NAME,"input")
- 通过xpath语句进行定位 driver.find_element(By.XPATH,'//*[@id="kw"]')
- 通过css语法进行定位 driver.find_element(By.CSS_SELECTOR,"#kw")
- 通过文本进行定位 driver.find_element(By.LINK_TEXT,"新闻")
以百度为案例:
第一步:使用selenium打开我们的百度
需要导入的库:from selenium import webdriver from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
第二步:通过开发者工具找到我们需定位的元素:
例如我们定位“百度一下”:
代码实现:
这个是定位这个百度一下的三种定位方式,根据其匹配标签内容我们可以有不同的方式进行匹配。
# 1. 通过 id 定位:
driver.find_element(By.ID,"su")
# 2. 通过 class 定位: btn self-btn bg s_btn 我们可以发现这里面存在空格分隔,如果你直接全部使用的话,那么模拟器将定位不到内容,因此我们仅需取其中的一部分
driver.find_element(By.CLASS_NAME,"bg s_btn")
# 3. 通过 xpath 定位: //*[@id="su"]
driver.find_element(By.XPATH,'//*[@id="su"]')
driver操作表单元素
操作输入框:
第一步:找到这个元素。
第二步:使用send_keys(value),将数据填充进去
使用clear方法可以清除输入框中的内容:
inputTag = driver.find_element_by_id('su')
inputTag.clear()
操作按钮有很多种方式。比如单击、右击、双击等。这里讲一个最常用的。就是点击。直接调用click函数就可以了
inputTag = driver.find_element_by_id('su')
inputTag.click()
鼠标行为链
有时候在页面中的操作可能要有很多步,那么这时候可以使用鼠标行为链类ActionChains来完成。比如现在要将鼠标移动到某个元素上并执行点击事件。
actions = ActionChains(driver) # 首先需要创建一个鼠标行为链对象,并将驱动传递进去
actions.move_to_element(inputTag) # move_to_element:将鼠标移至inputTag的位置
actions.send_keys_to_element(inputTag,'python') # send_keys_to_element 在定位的元素中输入
actions.move_to_element(submitTag)
actions.context_click() # 鼠标进行右击
actions.click(submitTag) # 鼠标在定位元素进行单击
actions.perform() # 这个是鼠标执行操作的必要,不然你上面的操作都没法执行
还有更多的鼠标相关的操作
-
click_and_hold(element):点击但不松开鼠标。
-
context_click(element):右键点击。
-
double_click(element):双击。
-
更多方法请参考:7. WebDriver API — Selenium Python Bindings 2 documentation
Cookie操作
-
获取所有的cookie:cookies = driver.get_cookies()
-
根据cookie的name获取cookie:value = driver.get_cookie(name)
-
删除某个cookie driver.delete_cookie('key')
页面等待:
现在的网页越来越多采用了 Ajax 技术,这样程序便不能确定何时某个元素完全加载出来了。如果实际页面等待时间过长导致某个dom元素还没出来,但是你的代码直接使用了这个WebElement,那么就会抛出NullPointer的异常。为了解决这个问题。所以 Selenium 提供了两种等待方式:一种是隐式等待、一种是显式等待。
-
隐式等待:调用driver.implicitly_wait。那么在获取不可用的元素之前,会先等待10秒中的时间
driver.implicitly_wait(10)
-
显示等待:显示等待是表明某个条件成立后才执行获取元素的操作。也可以在等待的时候指定一个最大的时间,如果超过这个时间那么就抛出一个异常。显示等待应该使用selenium.webdriver.support.excepted_conditions以及 selenium.webdriver.support.ui.WebDriverWait 配合使用
一些其他的等待条件
-
presence_of_element_located:某个元素已经加载完毕了。
-
presence_of_all_elements_located:网页中所有满足条件的元素都加载完毕了。
-
element_to_be_clickable:某个元素是可以点击了。