利用Selenium实现网页自动化测试

工具 selenium

资源地址

selenium既可以用来做测试、也可以用来爬资源,是白黑两道都趁手的工具:

selenium官网:

selenium文档:

Selenium发展史:

关于Selenium IDE

Selenium IDE可以自动录制用户的操作、然后保存为自动脚本。然而我已经放弃了使用Selenium IDE,因为我感觉直接编写脚本更顺手。

如果要在FireFox中使用Selenium IDE,则会碰到麻烦:火狐48以后的版本支持Selenium3,火狐48之前的版本支持selenium2,而火狐55以后的新版本不支持SeleniumIDE!以下是一个网友的描述:

Firefox V48.0.2(V56.0也是OK的亲试)可实现完美兼容,需保证浏览器不自动更新。步骤如下:

(1)火狐浏览器选择自定义安装(不要选择默认安装),取消勾选“安装维护服务”;

(2)安装完成后,工具——选项——firefox更新——勾选“不检查更新”即可

如果你已经安装了高版本的Firefox或者更新设置屡试不爽,可试试上面的方法!

也就是退回到旧版本。以下是旧版火狐的下载地址:

以下是来自官网的信息,开发者说:正在基于SideeX重写Selenium IDE,SideeX很慷慨地贡献了技术。



以下是来自SideeX的描述:我们尊重和感谢Selenium开发了伟大实用的工具,现在由我们添砖加瓦了!



来自开源世界的惺惺相惜真是让人羡慕啊!

关于WebDriver

WebDriver是W3C的一个标准,由Selenium主持:

WebDriver之所以能够实现与浏览器进行交互,是因为浏览器实现了这些协议:


以下网址归纳了各个浏览器驱动器的下载地址:

firefox driver官方地址:

chrome driver官方地址及国内镜像:

Microsoft Web Driver官方地址:

编程环境pycharm

资源地址

强大的IDE工具pycharm,免费开源的社区版够用,下载地址:

pycharm的界面风格与Intelli IDEA一致,用过Android Studio的人打开pycharm后会感觉似乎在用AS。

虚拟环境和python解释器的版本

创建项目时,选择虚拟环境和python解释器的版本。



管理Python包和Python库

选择菜单项“File → Settings”,点击Project Interpreter,若要添加python包则点击按钮“+”:





添加国内的资源库地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/



Selenium编程

配置Python环境

1)确保selenium包已添加项目的虚拟环境中

2)下载所需的WebDriver,并复制到在系统PATH中的任何目录下,例如把它们放在python解释器目录下:



3)网页元素定义id以便于Selenium脚本定位

示例代码

以下示例:打开firefox、访问网址、填写账号、点击按钮登录、查找网页菜单项、点击菜单项、退出:



# -*- coding: utf-8 -*-
"""
Title     : Example of using Selenium
Created by: Mara
Created on: 2018/4/23 12:24
"""

from selenium import webdriver
from time import sleep
from selenium.webdriver.common.action_chains import ActionChains
import common_values


def click_sub_menu(the_browser, main_item, sub_item):
    main_menu = the_browser.find_element_by_id("topMenuForm:" + main_item)
    ActionChains(the_browser).move_to_element(main_menu).perform()
    sleep(common_values.PAGE_WAIT_SHOW_SECONDS)

    sub_menu = the_browser.find_element_by_id("topMenuForm:" + sub_item)
    ActionChains(the_browser).move_to_element(sub_menu).perform()
    sleep(common_values.PAGE_WAIT_SHOW_SECONDS)
    sub_menu.click()
    sleep(common_values.PAGE_WAIT_SHOW_SECONDS)

def logout(the_browser):
    click_sub_menu(the_browser, "AccountMenu", "LogoutMenu")

if __name__ == '__main__':
    browser = webdriver.Firefox()
    browser.get("http://localhost:8080/QXSKweb/faces/login.xhtml")
    browser.implicitly_wait(10)
    browser.maximize_window()

    browser.find_element_by_id("logForm:user").send_keys("测试-普通用户")
    browser.find_element_by_id("logForm:Pass").send_keys("TesterCommon")
    browser.find_element_by_id("logForm:loginButton").click()

    click_sub_menu(browser, "UserMenu", "UserSubMenu")

    logout(browser)

常用selenuim代码

以下是一些常用的selenuim代码:

# 打开firefox 浏览器
browser = webdriver.Firefox()

# 访问地址
browser.get(loginUrl)

# 设置浏览器窗口
browser.maximize_window()
browser.set_window_size(1000, 800)
browser.set_window_position(22, 33)

# 操作页面
browser.implicitly_wait(2)
time.sleep(5)
browser.back()
browser.forward()

#定位元素
browser.find_element_by_id('kw1').send_keys("selenium")
browser.find_element_by_xpath("//input[@id='kw1']").send_keys("selenium")
browser.find_element_by_link_text("贴 吧").click()
browser.find_element_by_partial_link_text("贴").click()
browser.find_element_by_css_selector("#kw1").send_keys("selenium")
browser.find_element_by_class_name("btn").click()

# 操作元素
browser.find_element_by_id("kw1").clear()
browser.find_element_by_id('su1').click()
browser.find_element_by_id('su1').submit()
browser.find_element_by_xpath("//input[@id='kw1']").send_keys("selenium")
browser.find_element_by_id('kw1').send_keys(Keys.ENTER)
browser.find_element_by_id('kw1').send_keys(Keys.CONTROL, 'a')
pswd = driver.find_element_by_id("password")

# 鼠标双击事件 
doubleclick(element)

# 右键单击鼠标
rightclick = ActionChains(driver)
rightclick.context_click(pswd).perform()

# 鼠标拖放事件 
drag_and_drop(element, target) // element ,target 分别为原位置和目标位置