Selenium 自动化测试工具的使用

安装配置

我们要对Web进行模拟自动化测试的时候,可以使用Selenium或者是Puppeteer工具。其中Puppeteer通过控制无头Chrome来完成浏览器的工作。这两个工具之间的区别在于:Selenium更加关注程序的执行流程本身,比如找到指定的元素,设置相应的值,然后点击操作。而Puppeteer是浏览器的视角,比如光标移动到某个元素上,键盘输入某个内容等。

使用selenium库模拟浏览器,这里我使用的是Chrome浏览器,需要事先安装好selenium模块,然后下载ChromeDriver,它的作用是启动Chrome浏览器来进行模拟,ChromeDriver的下载地址是:

https://sites.google.com/a/chromium.org/chromedriver/downloads

根据自己的浏览器版本下载对应的版本的驱动,不对的驱动的话会启动不了Chrome,将下载好的驱动放到指定的文件夹里面,后面会用到。

通过selenium启动Chrome的代码为:

# 配置selenium
from selenium import webdriver
driver = webdriver.Chrome()
driver.get(request_url)

注: 环境Ubuntu18.04LTS

实例 :抓取豆瓣的刘亦菲的海报图片的爬虫程序,调用之前定义好的下载图片的函数,完整代码如下(不需要登录的情况下就可抓取):

# coding:utf-8
# 下载刘亦菲的电影封面海报
import requests
import json
from lxml import etree

# 配置selenium
from selenium import webdriver
# options = webdriver.ChromeOptions()
# options.add_argument("--incognito")  # 隐身模式打开
# driver_path = "/home/toohoo/Desktop/chromedriver_linux64/chromedriver"  # chromedriver的路径
driver = webdriver.Chrome("/home/toohoo/Desktop/chromedriver_linux64/chromedriver")

query = "刘亦菲"
'''下载图片'''
def download(src,id):
    # 将图片写到当前目录,原来的图片的格式是webp的,需要转换一下格式
    dir = './' + str(id) + '.jpg'
    try:
        pic = requests.get(src, timeout=10)
        fp = open(dir,'wb')
        fp.write(pic.content)
        fp.close()
    except requests.exceptions.ConnectionError:
        print('图片无法下载!')

'''for 循环 请求全部的url'''
request_url = 'https://www.douban.com/search?cat=1002&q=' + query
driver.get(request_url)

# 注意是这样写的!
html = etree.HTML(driver.page_source)

srcs = html.xpath("//div/a[@class='nbg']/img/@src ")
titles = html.xpath("//div[@class='title']/h3/a/text()")

for src,title in zip(srcs, titles):
    # 调用的时候记得转换编码!!
    download(src, title.encode("utf-8"))

这里说一下遇到的问题:

  • 1、我的环境是Ubuntu18.04的,启动的时候发现启动不了Chrome浏览器,后来发现驱动是可以直接运行的,在Linux下使用./chromedriver直接就可以运行了,在win下也是可以运行的.exe文件。然后在另一个窗口接着运行python wzxPostSpider.py就行。
  • 2、海报图片文件的编码问题,默认使用中文命名,如果不经过转码的话会出现编码错误,这里需要带调用下载函数的时候进行转码,转成utf-8的形式:
for src,title in zip(srcs, titles):
    # 调用的时候记得转换编码!!
    download(src, title.encode("utf-8"))

内容提取理论小结

我们可以使用Selenium工具自动化模拟浏览器,重点是实现对元素的定位。可以使用Selenium WebDriver来岁页面HTML进行获取和解析,然后通过HTML中的XPath进行提取,读取响应的内容。

那么如何使用Webdriver自带的元素定位功能,模拟浏览器的行为呢。首先需要知道其的基本的定位和操作知识:

如果想要定位一个元素,可以通过id,name,class,tag 链接上的全部文本,连接上的部分文本、XPath或者CSS进行定位,在Selenium的WebDriver中为我们提供的一些方法如下(8种):

1、通过id定位:可以使用find_element_by_id()函数。比如想要定位id=loginName的元素,就可以使用browser.find_element_by_id(“loginName”).
2、通过name定位:可以使用find_element_by_name()函数,比如我们想要对name=key_word的元素进行定位,就可以使用browser.find_elemrnt_by_name(“key_word”)。
3、通过class定位:可以使用find_element_by_class_name()函数。
4、通过tag定位:使用find_element_by_tag_name()函。
5、通过link上的完整文本定位:使用find_element_by_link_text()函数。
6、通过link上的部分文本定位:使用find_element_by_partial_link_text()函数。有时候超链接的文本很长,就可以通过查找部分的文本内容进行定位。
7、通过XPath进行定位:使用find_element_by_xpath()函数。使用XPath定位的通用性比较好,因为id,name,class为多个的时候,或者元素没有这些属性值的时候,Xpath就可以帮助我们完成任务。
8、通过CSS定位:使用find_element_by_css_selector()函数。CSS定位也是常用的定位方法,相比于XPath来说简洁。

在获取到某个元素之后,就可以对这个元素记性操作了。对元素的操作如下:

1、清空输入框的内容:使用clear()函数;
2、在输入框中输入内容:使用send_keys(content)函数传入要输入的文本;
3、点击按钮:使用click()函数,如果元素是个按钮或者链接的时候,可以点击操作;
4、提交表单:使用submit()函数,元素对象为一个表单的时候,可以提交表单;

模拟登录豆瓣写影评,未完~

你可能感兴趣的:(Python,软件测试)