• 关于Selenium remote模式分布式执行UI自动化测试必定面临的性能问题


    1、大部分自动化测试人员都是在本地执行UI自动化测试,也就是代码和浏览器必须在同一台机器上,这样的的缺陷很多,无法多任务并发执行UI自动化测试用例,效率极低

    2、正是如此,Selenium 的remote模式为我们带来了解决办法(俗称Selenium gird)工作原理就是分布式的,由一个中央控制器来控制多个节点机器(用例执行机)来同时多任务并发执行UI自动化测试用例,详见博客:(http://www.cnblogs.com/zw520ly/p/5995708.html

    3、虽然这样解决了多任务并发的问题,减少了测试时间,减轻了中央控制器的负载压力,但是又带来另外一个性能问题,节点机器(用例执行机)有很大的风险出现内存溢出,具体原因我来分析一下:Selenium驱动浏览器靠的是第三方插件driver(对应到不同的浏览器有不同的driver),这个driver启动时会在节点机器上另起一个进程,用来驱动浏览器工作,通常执行测试完毕后,我们会调用driver.quit()和driver.close()关闭driver的进程和退出浏览器,【quit()方法会退出浏览器并且杀死driver的进程,但是它只会杀死当前的driver进程close()方法纯粹关闭当前浏览器,不会杀死当前driver进程,如果不处理,driver进程永久占用内存资源】,看上去driver.quit()方法似乎很完美的解决了我们的问题,但是你的测试用例(代码)在执行过程中异常终止,你的driver进程被永久保存下来,测试用例异常终止的次数多了,driver进程把你的内存占用的也差不多了,节点机器(用例执行机)卡顿、死机就是家常便饭了。

    4、我们该如何解决节点机器(用例执行机)出现的内存溢出的问题,解决办法,每次执行用例之前或者执行完用例之后通过telnet远程到节点机器(用例执行机)执行shell或dos命令,关闭driver的进程和浏览器进程(taskkill /f /t /IM chrome.exe    taskkill /f /t /IM chromedriver.exe),做的更保险一点,每次执行完用例之后调用driver.quit()方法,双保险,保证每次driver和浏览器都被正常关闭。

    代码片段:

    @Test
    public void test1() throws Exception {

    //telnet远程win主机的工具类
    TelnetUtils telnetUtils = new TelnetUtils("VT220", ">");

    //杀死浏览器进程
    telnetUtils.excuteWinCmd("172.19.21.216", "23", "xxxx", "xxxx","taskkill /f /t /IM chrome.exe");

    //杀死driver进程
    telnetUtils.excuteWinCmd("172.19.21.216", "23", "xxxx", "xxxx","taskkill /f /t /IM chromedriver.exe");

    //构建用例对象
    WebUiEntity entity = new WebUiEntity();
    entity.setId("username");
    entity.setElementAction("sendKeys");
    entity.setElementValue("xxxx");
    WebUiEntity entity1 = new WebUiEntity();
    entity1.setId("password");
    entity1.setElementAction("sendKeys");
    entity1.setElementValue("xxxx");
    WebUiEntity entity2 = new WebUiEntity();
    entity2.setName("submitLogin");
    entity2.setElementAction("click");
    WebUiEntity entity3 = new WebUiEntity();
    entity3.setId("patient_management");
    entity3.setElementAction("click");
    entity3.setCaseFunction("{WaitElement}[waitElementPresence]<>()");
    WebUiEntity entity4 = new WebUiEntity();
    entity4.setIframe("paFrame");
    entity4.setId("patiName");
    entity4.setElementAction("sendKeys");
    entity4.setElementValue("自动化测试患者");

    WebUiEntity entity5 = new WebUiEntity();
    entity5.setId("Account_box");
    entity5.setCaseFunction("{JavaScriptExecute}[changeStyle]<String;String>(display;block)");
    WebUiEntity entity6 = new WebUiEntity();
    entity6.setClassName("i-exit1");
    entity6.setCaseInformation("退出登录");
    entity6.setElementAction("click");
    entity6.setCaseFunction("{WaitElement}[fixedWait]<String>(4000)");

    WebUiDriver webUiDriver = new WebUiDriver("", "", "chrome",
    "https://passporttest.pawjzs.com/login?targetType=wanjiaB_SZ&service=https%3A%2F%2Fmyclinictest.pawjzs.com%2F");
    PageElement pageElement = new PageElement();
    pageElement.elementAction(webUiDriver.driver, entity);
    pageElement.elementAction(webUiDriver.driver, entity1);
    pageElement.elementAction(webUiDriver.driver, entity2);
    pageElement.elementAction(webUiDriver.driver, entity3);
    pageElement.elementAction(webUiDriver.driver, entity4);
    pageElement.elementAction(webUiDriver.driver, entity5);
    pageElement.elementAction(webUiDriver.driver, entity6);
    //安全退出【当前】driver进程并关闭当前浏览器
    webUiDriver.driver.quit();
    }

  • 相关阅读:
    Windows7驱动调试小Tips
    [Sencha ExtJS &amp; Touch] 在Sencha(Extjs/Touch)应用程序中使用plugins(插件)和mixins(混入)
    C语言开发函数库时利用不透明指针对外隐藏结构体细节
    CLLocationManagerDelegate的解说
    RecyclerView的使用(1)之HelloWorld
    黑马day07 登录注冊案例(一)
    在互联网公司和行业软件公司上班,有什么差别?
    RHEL7 -- systemd
    RHEL7 -- 识别文件系统和设备
    11G新特性 -- 块介质恢复性能增强(block media recovery)
  • 原文地址:https://www.cnblogs.com/zw520ly/p/8888694.html
Copyright © 2020-2023  润新知