0%

selenium模块实现web自动化测试

什么是selenium

Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,Selenium可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器),可以接收指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏。
这里是个有趣的解释

什么是无头浏览器

A headless browser is a web browser without a graphical user interface.

这是维基百科的解释。意思就是没有图形界面的浏览器。

Headless browsers provide automated control of a web page in an environment similar to popular web browsers, but are executed via a command-line interface or using network communication. They are particularly useful for testing web pages as they are able to render and understand HTML the same way a browser would, including styling elements such as page layout, colour, font selection and execution of JavaScript and AJAX which are usually not available when using other testing methods.

以命令行接口或者网络通信的方式驱动浏览器,主要用于网页测试。
参考这些网友的知乎回答

selenium模块基本用法

使用webdriver模块驱动phantomjs无头浏览器

1
2
3
4
5
from selenium import webdriver

driver = webdriver.PhantomJS(r"E:\phantomjs-2.1.1-windows\phantomjs-2.1.1-windows\bin\phantomjs.exe") #实例化一个driver
driver.get("http://www.baidu.com") #发送请求
driver.save_screenshot("15.png") #保存截图

webdriver生成截图保存到本地。
image.png


driver = webdriver.PhantomJS(r"E:\phantomjs-2.1.1-windows\phantomjs-2.1.1-windows\bin\phantomjs.exe")这一句里面,r的作用是去除转义影响,避免了对windows路径里面的\作转义的麻烦。

使用webdriver模块驱动chromdriver无头浏览器

1
2
3
4
5
from selenium import webdriver

driver = webdriver.Chrome(r"E:\chromedriver_win32\chromedriver.exe") #实例化一个driver
driver.get("http://www.baidu.com") #发送请求
driver.save_screenshot("14.png") #保存截图

因为我本地下载了chromdriver,对应的版本和我电脑上chrom浏览器的版本一致,所以这个程序运行时,可以看到浏览器运行的界面和过程,像这样。
image.png


我对应下载的chromedriver下载地址
image.png

定位和操作

  • 定位
    driver.find_element_by_id("kw").send_keys("python")这是通过id进行定位。
    还可以通过xpath定位,例如:

    1
    2
    3
    4
    5
    6
    from selenium import webdriver
    import time

    driver = webdriver.Chrome(r"E:\chromedriver_win32\chromedriver.exe") #实例化一个driver
    driver.get("http://www.baidu.com") #发送请求
    driver.find_element_by_xpath("//input[@class='s_ipt']").send_keys("hello")

    image.png

  • 模拟输入行为

    1
    2
    3
    4
    5
    6
    7
    8
    from selenium import webdriver
    import time

    driver = webdriver.Chrome(r"E:\chromedriver_win32\chromedriver.exe") #实例化一个driver
    driver.get("http://www.baidu.com") #发送请求
    driver.find_element_by_id("kw").send_keys("python") #定位到id为kw的元素,输入python
    time.sleep(2) #睡两秒
    driver.quit() #退出浏览器

    driver.find_element_by_id("kw").send_keys("python")这个意思是找到id为kw的元素,输入搜索词python
    image.png
    image.png


driver.quit():退出浏览器
driver.close():退出浏览器当前页面

  • 模拟点击行为

    1
    2
    3
    4
    5
    6
    7
    8
    from selenium import webdriver
    import time

    driver = webdriver.Chrome(r"E:\chromedriver_win32\chromedriver.exe") #实例化一个driver
    driver.get("http://www.baidu.com") #发送请求
    driver.find_element_by_id("kw").send_keys("python") #定位到id为kw的元素,输入python
    driver.find_element_by_id("su").click() #定位到id为su的元素,做点击操作
    time.sleep(2) #睡两秒

    image.png

  • 获取cookie

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    from selenium import webdriver
    import time

    driver = webdriver.Chrome(r"E:\chromedriver_win32\chromedriver.exe") #实例化一个driver
    driver.get("http://www.baidu.com") #发送请求
    driver.find_element_by_id("kw").send_keys("python") #定位到id为kw的元素,输入python
    driver.find_element_by_id("su").click() #定位到id为su的元素,做点击操作
    cookies = driver.get_cookies() #获取cookies
    print(cookies) #打印的结果是一个列表,列表元素为字典
    print("*"*100)
    cookies = {i["name"]:i["value"] for i in cookies} #利用列表推导式,将列表转换为字典
    print(cookies) #打印结果是一个字典,这个字典就是cookies的键值对

    程序运行结果:
    image.png

获取页面源码

1
2
3
4
5
6
7
8
9
from selenium import webdriver
import time

driver = webdriver.Chrome(r"E:\chromedriver_win32\chromedriver.exe") #实例化一个driver
driver.get("http://www.baidu.com") #发送请求
driver.find_element_by_id("kw").send_keys("python") #定位到id为kw的元素,输入python
driver.find_element_by_id("su").click() #定位到id为su的元素,做点击操作
page_source = driver.page_source
print(page_source)

程序运行结果:
image.png

获取当前url

比如,我们可以获取到点击【百度一下】这个按钮时对应的url。

1
2
3
4
5
6
7
8
9
from selenium import webdriver
import time

driver = webdriver.Chrome(r"E:\chromedriver_win32\chromedriver.exe") #实例化一个driver
driver.get("http://www.baidu.com") #发送请求
driver.find_element_by_id("kw").send_keys("python") #定位到id为kw的元素,输入python
driver.find_element_by_id("su").click() #定位到id为su的元素,做点击操作
current_url = driver.current_url
print(current_url)

程序运行结果:
image.png

  • find_element和find_elements的区别
    find_element返回一个元素,如果没有结果则报错
    find_elements返回一个列表,如果没有结果则返回空列表
    image.png
    image.png
    image.png
    image.png

获取标签的文本内容,要使用.text方法。
image.png

1
2
3
4
5
6
7
8
9
10
from selenium import webdriver
import time

driver = webdriver.Chrome(r"E:\chromedriver_win32\chromedriver.exe") #实例化一个driver
driver.get("https://bh.sb/") #发送请求
result1 = driver.find_elements_by_xpath("//div[@class='content']/article")
# print(result1) #返回的是列表
for article in result1:
result2 = article.find_element_by_xpath("./p[@class='note']").text
print(result2)

程序运行结果:
image.png


by_xpath中获取属性和文本需要使用get_attribute() 和.text
image.png

1
2
3
4
5
6
7
8
9
from selenium import webdriver
import time

driver = webdriver.Chrome(r"E:\chromedriver_win32\chromedriver.exe") #实例化一个driver
driver.get("https://bh.sb/") #发送请求
result1 = driver.find_elements_by_xpath("//div[@class='content']/article")
for article in result1:
result2 = article.find_element_by_xpath("./p[@class='focus']/a").get_attribute("href")
print(result2)

程序运行结果:
image.png

  • 获取文本对应的url链接
    find_element_by_link_text:文本内容全包含
    find_element_by_partial_link_text:文本内容部分包含
    举例:

    1
    2
    3
    4
    5
    6
    7
    from selenium import webdriver
    import time

    driver = webdriver.Chrome(r"E:\chromedriver_win32\chromedriver.exe") #实例化一个driver
    driver.get("https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=python&rsv_pq=cf780276001c69b1&rsv_t=b63boxEoUd2mj3Cb6CKdi%2B%2BKLueLrf4Ba7bChU%2BVNKhUuiCvKToE2IaMhQU&rqlang=cn&rsv_enter=0&rsv_dl=tb&rsv_sug3=6&inputT=189&rsv_sug4=189") #发送请求
    link = driver.find_element_by_partial_link_text("下一页").get_attribute("href")
    print(link)

    程序运行结果:
    image.png

  • 定位iframe中的内容
    直接定位iframe中的内容,程序会报错:
    image.png
    image.png
    我们定位iframe中的内容,需要先切换到iframe。

    1
    2
    3
    4
    5
    6
    7
    8
    from selenium import webdriver
    import time

    driver = webdriver.Chrome(r"E:\chromedriver_win32\chromedriver.exe") #实例化一个driver
    driver.get("https://mail.qq.com/") #发送请求
    # driver.switch_to.frame("login_frame") #这两种方法都可以切换到iframe
    driver.switch_to_frame("login_frame") #这是根据iframe的id来定位iframe的
    driver.find_element_by_id("u").send_keys("123456")

    注意

    如果网站采用了动态html技术,那么页面上的部分元素出现时间便不能确定,这个时候就可以设置一个等待时间,强制要求在时间内出现,否则报错。
    举例:
    image.png
    image.png
    代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    from selenium import webdriver
    import time

    driver = webdriver.Chrome(r"E:\chromedriver_win32\chromedriver.exe") #实例化一个driver
    driver.get("https://www.bilibili.com/v/kichiku/mad/?spm_id_from=333.5.b_7375626e6176.3#/") #发送请求
    driver.find_element_by_xpath("//button[@class='nav-btn iconfont icon-arrowdown3']").click() #定位【下一页】按钮,并点击
    time.sleep(3) #睡3秒
    result = driver.find_elements_by_xpath("//ul[@class='vd-list mod-2']/li//a[@class='title']") #提取这一页的内容
    for title in result:
    print(title.text)
    driver.quit()
-------------本文结束感谢您的阅读-------------