(一)自定义和浏览器相关的关键字

PYTHON 版本:3.6,不同的版本可能有区别,自己注意下。

以下代码GitHub 版本库地址: https://github.com/blairwind/blog_rf

SeleniumLibrary的扩展文档中提供了3种增加SeleniumLibrary功能的方式。

(1)Plugin API

(2)EventFiringWebDriver

(3)Extending SeleniumLibrary(实际就是继承SeleniumLibrary库)

这里采用继承SeleniumLibrary库的方式。

目录结构如下:这里我们将上一篇中说到的关键字加进来

BlogSeleniumLibrary.__init__.py  的代码

# #-*-coding:utf-8-*-
#
from robot.libraries import BuiltIn
from SeleniumLibrary.base import DynamicCore
from SeleniumLibrary.keywords import (AlertKeywords,
BrowserManagementKeywords,
CookieKeywords,
ElementKeywords,
FormElementKeywords,
FrameKeywords,
JavaScriptKeywords,
RunOnFailureKeywords,
ScreenshotKeywords,
SelectElementKeywords,
TableElementKeywords,
WaitingKeywords,
WebDriverCache,
WindowKeywords)
from SeleniumLibrary.locators import ElementFinder
from SeleniumLibrary.utils import Deprecated, LibraryListener, timestr_to_secs
from SeleniumLibrary import SeleniumLibrary from BlogSeleniumLibrary.keywords import (
KeyboardKeywords) class BlogSeleniumLibrary(SeleniumLibrary): def __init__(self, timeout=5.0, implicit_wait=0.0,
run_on_failure='Capture Page Screenshot',
screenshot_root_directory=None):
self.timeout = timestr_to_secs(timeout)
self.implicit_wait = timestr_to_secs(implicit_wait)
self.speed = 0.0
self.run_on_failure_keyword \
= RunOnFailureKeywords.resolve_keyword(run_on_failure)
self._running_on_failure_keyword = False
self.screenshot_root_directory = screenshot_root_directory
libraries = [
AlertKeywords(self),
BrowserManagementKeywords(self),
CookieKeywords(self),
ElementKeywords(self),
FormElementKeywords(self),
FrameKeywords(self),
JavaScriptKeywords(self),
RunOnFailureKeywords(self),
ScreenshotKeywords(self),
SelectElementKeywords(self),
TableElementKeywords(self),
WaitingKeywords(self),
WindowKeywords(self),
KeyboardKeywords(self)
]
self._drivers = WebDriverCache()
DynamicCore.__init__(self, libraries)
self.ROBOT_LIBRARY_LISTENER = LibraryListener()
self._element_finder = ElementFinder(self) _speed_in_secs = Deprecated('_speed_in_secs', 'speed')
_timeout_in_secs = Deprecated('_timeout_in_secs', 'timeout')
_implicit_wait_in_secs = Deprecated('_implicit_wait_in_secs',
'implicit_wait')
_run_on_failure_keyword = Deprecated('_run_on_failure_keyword',
'run_on_failure_keyword')

BlogSeleniumLibrary.keywords.__init__.py  的代码

from .keyboard import KeyboardKeywords

BlogSeleniumLibrary.keywords.keyboard.py  的代码

 from SeleniumLibrary.base import keyword, LibraryComponent
from selenium.webdriver.chrome.options import Options
from selenium import webdriver
from SeleniumLibrary.locators import WindowManager class KeyboardKeywords(LibraryComponent): def __init__(self, ctx):
LibraryComponent.__init__(self, ctx)
self._window_manager = WindowManager(ctx) @keyword()
def get_chrome_options(self, downloads_path):
'''
自定义chrome启动参数
:param downloads_path: 设置默认的文件下载路径
:return:
'''
chrome_options = Options()
prefs = {
"download.default_directory": str(downloads_path),
}
chrome_options.add_experimental_option('prefs', prefs) # 设置默认的文件下载路径
chrome_options.add_argument('disable-infobars') # chrome76以下禁用chrome受自动软件控制
# 下面2行chrome76及以上禁用chrome受自动软件控制
chrome_options.add_experimental_option("useAutomationExtension", False)
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
return chrome_options @keyword()
def open_browser_new(self, alias=None,**kwargs):
'''
:return:
'''
desired_caps = {
"platform": kwargs["platform"], #操作系统
# "platform":"LINUX",
"browserName": kwargs["browserName"], #浏览器
"version":kwargs["version"] #浏览器版本
} driver = webdriver.Remote(command_executor=kwargs["remote_url"],
desired_capabilities=desired_caps,
options=kwargs["chrome_options"])
return self.ctx.register_driver(driver,alias)

最后,在RF中导入继承SeleniumLibrary后新建的库就行了,如下:

注意在RF中python 包名和类名一样的的话,导入库的时候就只需要填包名就行了,RF可以直接识别到。不一样的话就还需要加上.class名称,下面这个是不使用selenium grid的版本

*** Settings ***
Library BlogSeleniumLibrary #注意这一行不一样
Suite Teardown CLOSE BROWSER *** Variables ***
${browser} Chrome
${login_url} https://account.cnblogs.com/signin *** Test Cases ***
登录-XXXXXX
登录-打开浏览器并进入登录页面 *** Keywords ***
登录-打开浏览器并进入登录页面
${options}= GET CHROME OPTIONS D:/projectname/testdata/downloads
CREATE WEBDRIVER ${browser} chrome_options=${options}
GO TO ${login_url}
SET SELENIUM IMPLICIT WAIT 10
MAXIMIZE BROWSER WINDOW

(二)如果要使用selenium grid呢

上篇中说到在RF中使用selenium grid ,在这里说明下。(为什么不使用RF自带的open browser,原因是个人觉得这种方式更方便添加不同的参数。)可以看到这里新加了一个关键字

当然,既然用了selenium grid,肯定会考虑并发执行用例,以及合并测试报告的问题,这里暂不考虑这个。

     @keyword()
def open_browser_new(self, alias=None,**kwargs):
'''
:return:
'''
desired_caps = {
"platform": kwargs["platform"], #操作系统
# "platform":"LINUX",
"browserName": kwargs["browserName"], #浏览器
"version":kwargs["version"] #浏览器版本
} driver = webdriver.Remote(command_executor=kwargs["remote_url"],
desired_capabilities=desired_caps,
options=kwargs["chrome_options"])
return self.ctx.register_driver(driver,alias)

在RF中调用这个关键字去启动浏览器就行了。当然前提是你要有一个配好的selenium grid环境,remote_url填自己selenium grid的地址。

 *** Settings ***
Library BlogSeleniumLibrary
Suite Teardown CLOSE BROWSER *** Variables ***
${platform} WINDOWS
${browser} chrome
${version} 79
${remote_url} http://192.168.63.1:4444/wd/hub
${login_url} https://account.cnblogs.com/signin *** Test Cases ***
登录-XXXXXX
登录-打开浏览器并进入登录页面 *** Keywords ***
登录-打开浏览器并进入登录页面
${options}= GET CHROME OPTIONS D:/projectname/testdata/downloads #这里是写死的路径,实际项目中应该动态去获取工程路径/testdata/downloads
OPEN BROWSER NEW platform=${platform} browserName=${browser} version=${version}
... chrome_options=${options} remote_url=${remote_url}
GO TO ${login_url}
SET SELENIUM IMPLICIT WAIT 10
MAXIMIZE BROWSER WINDOW

(三)自定义和浏览器无关的关键字(例如:和数据库相关的关键字)

如果有一些关键字用不到selenium 的webdriver,可以考虑独立出来。例如数据库相关的关键字,实现方式以及在RF中的导入方式,可以参考上一篇的mykeyword 关键字的写法。

robot framework笔记(三):扩展SeleniumLibrary库 (自定义关键字)的更多相关文章

  1. robot framework笔记(一):环境配置(基于python3)+在pycharm中编写及运行robot脚本

    (一)使用pip安装robotframework框架和seleniumlibrary库 pip install --upgrade robotframework pip install --upgra ...

  2. Robot Framework(三)创建测试用例

    2.2.1测试用例语法 基本语法 测试用例由关键字在测试用例表中构建.关键字可以从测试库或资源文件导入,也可以在测试用例文件本身的关键字表中创建. 测试用例表中的第一列包含测试用例名称.测试用例从包含 ...

  3. robot framework笔记(二):在RF中自定义chrome启动参数

    (一)在RF中自定义chrome启动参数 这里主要是实现下面2个功能 1.禁用chrome正受自动测试软件控制的提示 2.设置默认的下载路径(一些导出.下载类的功能,将文件下载到指定路径下) 自定义一 ...

  4. robot framework用python扩展编写自定义library

    我的utils.py文件 #!/usr/bin/env python #-*- coding:utf8 -*- __version__ = '0.1' import sys reload(sys) s ...

  5. robot framework 笔记(三),RF安装

    背景: 本来robot framework的安装应该放在一开始写的,因写博客的时候已经装过了,恰巧重装系统又重装了一遍RF RF推荐使用python2, 使用3的话会遇到一些页面非友好的问题 需要的安 ...

  6. Robot Framework - 1 - 测试用例与测试库

    01- 关于测试库(Test libraries) Test libraries provide the actual testing capabilities to Robot Framework ...

  7. Robot Framework自动化测试三(selenium API)

    Robot  Framework  Selenium  API 说明: 此文档只是将最常用的UI 操作列出.更多方法请查找selenium2Library 关键字库. 一.浏览器驱动 通过不同的浏览器 ...

  8. robot framework 笔记(一)

    背景: 平时使用rf时会用到一些方法,长时间不用就会忘记,本文用来记录当做自己的小笔记 内容持续更新中········ 一.robot framework 大小写转换 1.转换小写: ${low} E ...

  9. robot framework 使用三:他们主动浏览器的兼容性

    robot framework 浏览器兼容性测试 上图中黄色圈的地方默认什么都不写,是firefox浏览器.写上ie就是ie浏览器了 firefox最新版本号即可,ie须要设置: 1. IE选项设置的 ...

随机推荐

  1. ESXi6.5上的Ubuntu虚机在远程SSH时宕机

    情况是这样的, 有一个ESXi6.5上跑的Ubuntu虚机, 版本是18.04.1, 今天升级成18.04.2后, 就发现远程连接SSH不对劲, 在本地登录和操作都好好的, 只要远程SSH一连接, 服 ...

  2. Java与.net 关于URL Encode 的区别

    在c#中,HttpUtility.UrlEncode("www+mzwu+com")编码结果为www%2bmzwu%2bcom,在和Java开发的平台做对接的时候,对方用用url编 ...

  3. 利用lsof命令查找已经删除的文件来释放磁盘空间

    测试环境一台服务器/目录空间使用率达到97%,但是通过du -sh *发现实际空间没用到那么多,初步怀疑,之前删除的文件,有运行中的进程一直占用,导致空间没有释放,如图通过du -sh *发现共实际使 ...

  4. Mqtt paho 回调函数触发机制跟踪

    Python Mqtt paho 回调函数触发机制跟踪,我使用的是 buildroot 里面的 mqtt paho , 代码在 ''' buildroot-2017.02.8/output/build ...

  5. mysql监控工具sqlprofiler,类似sqlserver的profiler工具安装(一)

    最近无意发现了mysql的客户端监控工具“Nero Profile SQL”,刚开始还不知道怎么使用,经过半小时摸索,现将使用步骤写下来. 背景:开发的时候,如果数据存储层这块使用EF,或者其他orm ...

  6. linux系统(centos6)的目录结构

    /bin:bin是Binary的缩写, 这个目录存放着最经常使用的命令. /boot:这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件. /dev :dev是Device( ...

  7. [LeetCode] 12. Integer to Roman 整数转为罗马数字

    Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M. Symbol Value I 1 ...

  8. Eureka学习笔记

    解决:  自我保护: 消费端的调用: Euraka的集群:

  9. Jackson 动态Bean

    为了解决json字符串有很多属性, 但是不必每个属性都映射到pojo的属性. @JsonProperty : 标记一个方法是一个属性的getter或setter方法, 也即把java属性和json域关 ...

  10. c++基础(七)——面向对象程序设计

    面向对象程序设计(Object-oriented programming)的核心思想是数据抽象,继承,和动态绑定. 1. 继承 在C++语言中,基类将类型相关的函数与派生类不做改变直接继承的函数区分对 ...