• 0
  • 0
分享
  • ui自动化 SeleniumBase——软件测试圈
  • 恬恬圈 2022-02-17 12:02:30 字数 5609 阅读 1254 收藏 0

SeleniumBase是一个自动化web测试框架,它的设计pyse相似,基于selenium和unittest封装的框架,api多,支持命令行多参数执行

文档地址:https://github.com/seleniumbase/SeleniumBase

下载

pip下载 

pip install seleniumbase

git克隆

git clone https://github.com/seleniumbase/SeleniumBase.git
cd SeleniumBase
pip install -r requirements.txt
python setup.py develop

升级

--upgrade

卸载

--force-reinstall  --no-cache-dir

驱动安装

seleniumbase install chromedriver
seleniumbase install geckodriver
seleniumbase install edgedriver
seleniumbase install iedriver
seleniumbase install operadriver

运行

pytest my_first_test.py --browser=chrome  #如果没有写明浏览器默认为chrome浏览器启动

官方文档案例

from seleniumbase import BaseCase
class MyTestClass(BaseCase):
    def test_basic(self):#必须以test开头
        # 打开网页,参数1:url,默认为chrome浏览器
        self.open("https://xkcd.com/353/")
        '''
             open()
                 其中有等待时间 
                     open方法中的设置setting.WAIT_FOR_RSC_ON_PAGE_LOADS=True 开启显式等待
                     wait_for_ready_state_complete方法中设置等待时间(长时间等待,默认为30s)  
        '''
        # 页面元素断言,参数1:元素定位代码, 参数2:by=By.CSS_SELECTOR,默认css_selector选择器
        # 参数3:timeout=settings.SMALL_TIMEOUT,默认为6s
        self.assert_element('img[alt="Python"]')
        '''
            settings.SMALL_TIMEOUT默认等待时间为6s
            wait_for_element_visible()中自动识别顺序,不填写默认css-->xpath( 判断开头是否为'/','./','(' )-->link( 判断开头是否为'link=','link_text=' )
        '''
        # 点击页面元素,参数1:selector元素定位代码, 参数2:by=By.CSS_SELECTOR,
        # 参数3:timeout = settings.SMALL_TIMEOUT
        self.click('a[rel="license"]')
        '''
            settings.SMALL_TIMEOUT默认等待时间为6s
            wait_for_element_visible()中自动识别顺序,不填写默认css-->xpath-->link
            内置纯js,jquery点击页面
            
        '''
        # 区域内的断言文本,参数1:text, 参数2:selector="html", 参数3:by=By.CSS_SELECTOR,
        # 参数4:timeout=settings.SMALL_TIMEOUT
        self.assert_text("free to copy", "div center")
        '''
            timeout=settings.SMALL_TIMEOUT默认等待时间那为6s
            wait_for_text_visible()的自动识别,不填写默认css-->xpath( 判断开头是否为'/','./','(' )-->link_text( 判断开头是否为'link=','link_text=' )
 
        '''
        self.open("https://xkcd.com/1481/")  # 打开另一个网页
        # 得到一个属性,参数1:selector, 参数2:attribute获取元素属性值, 参数3:by=By.CSS_SELECTOR,
        # 参数4:timeout=settings.SMALL_TIMEOUT
        title = self.get_attribute("#comic img", "title")
        '''
            timeout=settings.SMALL_TIMEOUT默认等待时间那为6s
            get_attribute()自动识别不填写默认css -->xpath-->link_text
            
        '''
        # 校验这个字符串是否在这个属性中
        self.assert_true("86,400 seconds per day" in title)
        # 点击链接标签中非属性字符串'Blag'
        self.click("link=Blag")
        # 校验字符串"The blag of the webcomic"是否是h2标签的非属性字符串
        self.assert_text("The blag of the webcomic", "h2")
        # 用一个新值更新html中指定元素的值
        self.update_text("input#s", "Robots!\n")
        self.assert_text("Hooray robots!", "#content")
        self.open("https://xkcd.com/1319/")
        # 该方法类似于assert_text(),但要求文本精确,参数1:text, 参数2:selector="html", 参数3:by=By.CSS_SELECTOR,
        # 参数4:timeout=settings.SMALL_TIMEOUT
        self.assert_exact_text("Automation", "#ctitle")

其他方法:   

self.go_back() #这个方法将浏览器导航到前面的页面。
self.go_forward() #这个方法在历史中导航浏览器前进。
self.refresh_page() #此方法将重新加载当前页面。
这个方法返回当前页面的URL。
get_page_source() #这个方法返回当前页面源。
get_text() #从页面上的元素获取文本
wait_for_element_present("div.my_class", timeout=10) #在数秒内断言某个元素在页面上的存在
wait_for_element_visible("a.my_class", timeout=5) #在数秒内断言页面上元素的可见性
find_element("a.my_class", timeout=5).click() #在java中可以直接使用.click()直接找到元素进行点击,同样这里也可以
在css选择器中如div[class="class_name"],可以使用div.class_name)简单化
is_element_visible(selector) #是页面上可见的元素
is_element_present(selector) #是页面上的一个元素
is_text_visible(text, selector) #是页面上可见的文本
switch_to_window() #该选项卡切换到new选项卡(切换到新建一个页面)
switch_to_frame()#进入iframe
switch_to_default_content() #进入别忘了退出iframe
测试时弹出警告框:
wait_for_and_accept_alert() #接收
wait_for_and_dismiss_alert() #拒绝
self.activate_jquery()#在尚未加载jquery的页面使用jquery
delayed_assert_element()和delayed_assert_text()将保存将引发的任何异常。要将所有失败的延迟断言清除到一个异常中,请确保在测试方法的末尾调用self.process_delayed_assert()。如果您的测试到达多个页面,您可以在单个页面的所有延迟断言的末尾调用self. process_delayed_()。通过这种方式,日志文件中的屏幕快照将具有生成延迟断言的位置。

校验邮件的案例:

假设您有一个发送电子邮件的测试,现在您想检查电子邮件是否已收到

View Code

使用jquery的案例

View Code

注意事项:

1、selenium iumbase自动处理常见的web驱动程序操作,比如在测试失败时启动web浏览器和保存屏幕截图,并且会保存latest_logs/文件夹中。如果在设置中将ARCHIVE_EXISTING_LOGS设置为True,那么这些日志将被移动到archived_logs/。,否则日志文件将在下一次测试运行开始时被清除。)

2、settings.py设置,setting中有许多配置,如

  • 选择要使用的测试浏览器(默认:Chrome)

  • 选择betweeen pytest &nose unittest runners

  • 选择是否进入调试模式失败选择额外变量进入测试

  • 选择浏览器的用户代理使用自动化改变速度(演示模式)

  • 选择多线程运行测试

  • 选择是否重试失败测试

  • 选择BrowserStack服务器上运行

  • 选择的Sauce Labs server上运行

  • 选择TestingBot服务器上运行

  • 选择CrossBrowserTesting服务器

  • 选择一个selenium Grid连接选择数据库保存结果

  • 选择一个代理服务器连接 等

3、 运行命令行案例

pytest my_first_test.py
pytest my_first_test.py --demo_mode --browser=chrome  
pytest my_first_test.py --browser=firefox
pytest test_suite.py --html=report.html
nosetests test_suite.py --report --show_report
pytest test_suite.py --headless -n 4
pytest test_suite.py --reruns 1 --reruns-delay 2
pytest test_suite.py --server=IP_ADDRESS --port=4444   
pytest proxy_test.py --proxy=IP_ADDRESS:PORT
pytest proxy_test.py --proxy=USERNAME:PASSWORD@IP_ADDRESS:PORT
pytest user_agent_test.py --agent="USER-AGENT STRING"
pytest test_fail.py --pdb -s
官方建议使用pytest

--demo_mode 演示模式

使脚本执行的过程变得很慢,而且还会让操作的元素高亮显示,方便你查看和定位问题,并且可以在settings.py中设置demo_sleep设置等待时间

或者:

pytest my_first_test.py --browser=chrome --demo_mode --demo_sleep=1.2

-n 4

开启4个线程为你工作,这个取决于你cpu的颗粒数

--reruns 5 --reruns-delay 1

重试测试失败的案例5次,并且在重试期间等待多少秒

--pdb -s

在调试Selenium脚本的时候,我们希望错误时可以暂停脚本  

当出现错误时,你可以继续输入命令:

“c”:继续

“s”:步骤

“n”下一步

--report  生成一个报告

--show_report  在测试套件完成后立即显示Nosetest报告。只在本地运行测试时使用——show_report,因为它会暂停测试运行

4、在jenkins可插件可实现自动化集成 Xvfb headless browser plugin


作者:RainBol

原文链接:https://www.cnblogs.com/RainBol/p/10906654.html

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   内卷,是现在热度非常高的一个词汇,随着热度不断攀升,隐隐到了“万物皆可卷”的程度。究其来源,内卷这个词的出现,是伴随着996的讨论开始的。  很不幸,996、福报这些词的重灾区和源头就是计算机/互联网行业,那么作为行业中一个非常重要的分支,测试圈的情况怎么样呢?  软件测试圈的内卷是怎样的?  在谈起测试圈的内卷之前,我们必须先搞清楚常说的内卷是什么。  内卷,网络流行词,本意是指人类社会在一个发展阶段达到某种确定的形式后,停滞不前或无法转化为另一种高级模式的现象。当社会资源无法满足所有人的需求时,人们通过竞争来获取更多资源。  后经网络流传,用来指代非理性的内部竞争或“被自愿”竞争,现在...
            15 14 1001
            分享
          • 一、往期回顾如果用手机自带的浏览器去访问各种网页。自然而然都能获取到 WebView 的,不需要开启什么。用原生的、手机自带的浏览器去试下,也能得到对应的结果。首先,要确保 WebView 的出现,要识别什么是 WebView,WebView 一出现,就代表有 Html 页面。那么接下来的操作,可能就进入 WebView 里面操作了。但是看到了 WebView,要进入 WebView,你就面临了从原生控件的操作,进入了 Html 页面的操作。所以,第一件事情是必须切换,是上下文切换。要切换到这样的一个 WebView,必须保证我的代码当中能够得到 WebView 的名字。如何保证得到 WebV...
            0 0 1320
            分享
          •   软体测试空间前景广阔,大大小小的软件验收期都需要反反复复地进行各种功能测试。  关于功能本身的各种测试,相信对任何一个测试工程师来说都不是陌生的,在测试过程中,做过哪些测试?常听测试人员说,这个要做功能测试,这个是要做性能测试,这个要做兼容性测试等等,到底有什么测试类型?  非功能性测试概述  函数测试,想必对各位测试人员来说,也不会是陌生的,功能测试是验证产品的各个功能,根据功能测试用例,逐项测试,检查产品是否达到用户要求的功能,是测试人员最多的测试,就不多说了。所以是非功能测验与其相对,是什么是非功能测验?什么是非功能性功能所包含的?  除了评功能测试,还有什么其他的测试?  找一些资...
            0 0 939
            分享
          • HTML概述我们的网络应用软件主要包括两种:B/S系统和C/S系统。用户通过某界面程序输入数据、提交操作。服务器端对用户提交的数据进行处理,再将处理结果返回给到客户端。服务器端是对数据进行逻辑处理的,客户端提供界面给用户输入数据,显示结果信息。因为界面的不同,主要有两种:一种是基于网页的,叫做B/S系统(Browser)。另一种是基于客户端的,叫做C/S系统(Client)。B/S系统与C/S系统的优缺点1. B/S系统的客户端,因为浏览器已经是统一的。只需要实现界面内容即可,工作内容相对简单。2. 我们的电脑系统是不相同的,那么我们需要兼容不同的电脑。在这里,浏览器都能够被各种系统兼容,所以...
            0 9 3764
            分享
          • 目前用于兼容性测试的云测平台如雨后春笋般涌现。他们一般主打各种机型的兼容性测试,附加提供指定机型的真机测试,除了现在市场上的主流ios,android系统,现在甚至还出现了各种Harmony系统,以及各种不同的分辨率等,可以说给我们测试人员提供了很大便捷,再也不用为了申请什么测试机或者复现问题头疼了。当前常见的云测平台有:AWS Device Farm平台,Android机型只支持国外的机型,没有华为小米vivo等国产机(有点可惜),覆盖率低,费用为免费。阿里云MQC平台,Android机型比较丰富新颖,可以检测出app的崩溃、内存泄漏、异常等问题,日志log比较详细,可以帮助研发人员排查问题...
            1 0 4380
            分享
      • 51testing软件测试圈微信