【问题标题】:How to stop automatically closing browser when writing protractor test cases编写量角器测试用例时如何停止自动关闭浏览器
【发布时间】:2016-03-11 06:49:59
【问题描述】:

我是使用量角器为非角度应用程序编写测试用例的新手。我写了一个示例测试用例。运行测试用例后浏览器自动关闭。我该如何防止这种情况。这是我的代码

var submitBtnElm = $('input[data-behavior=saveContribution]');

      it('Should Search', function() {
        browser.driver.get('http://localhost/enrollments/osda1.html');   
        browser.driver.findElement(by.id('contributePercentValue')).sendKeys(50);
        submitBtnElm.click().then(function() {

        });
      });

【问题讨论】:

  • 你能再解释一下你的问题吗?浏览器自动关闭是什么意思?一旦完成运行脚本,您的浏览器不应该关闭吗?谢谢
  • @GirishSortur 我想执行点击操作。但是浏览器在触发点击之前关闭。我已经更新了问题中的代码。
  • 窗口关闭后控制台有日志吗?量角器/茉莉最后报告什么?
  • 我猜窗口正在关闭,因为您的定位器看起来不正确并且抛出错误,您在属性周围缺少引号。应该是var submitBtnElm = $('input[data-behavior="saveContribution"]');
  • 这是一个简单但有效的答案stackoverflow.com/a/62205388/9150146

标签: protractor


【解决方案1】:

我也在努力解决类似的问题,我有一个测试用例流程,我们正在与多个应用程序交互,当使用 Protractor 时,浏览器在执行一个 conf.js 文件后关闭。现在,当我查看先前的响应时,就像添加延迟一样,这取决于您执行下一个操作的速度,或者它是命中还是未命中。即使我们认为从调试的角度来看,大多数用户会在夜间运行,并且他们希望在分析问题之前让浏览器处于活动状态几个小时。所以我开始研究量角器的基本代码,并遇到了一个可以绕过这个问题的通用解决方案,独立于任何浏览器。目前解决方案是针对一个 conf.js 文件执行后浏览器不应关闭的要求,如果有人可以添加一个配置参数询问用户是否要在运行后关闭浏览器,则可以改进。

通过在命令行中使用标签--seleniumSessionId,可以将浏览器重用于将来运行的conf.js文件。

解决方案:

  • 转到 ..\AppData\Roaming\npm\node_modules\protractor\built 你的 量角器已安装。
  • 打开 driverProvider.js 文件并转到函数 quitDriver
  • return driver.quit() 替换为 return 0

就我目前的使用情况而言,代码更改似乎没有副作用,如果由于此更改而遇到任何其他问题,我会更新。下面是代码 sn-p 的快照。

谢谢 格里森

sn-p 代码截图:

【讨论】:

  • 嗨 Gleeson - 您应该考虑直接在您的答案中发布您的代码。这将使索引和引用变得更容易。
【解决方案2】:

在您的 it 函数末尾添加 browser.pause()。在函数本身内。

【讨论】:

  • 无论是在函数内部还是外部,它似乎都不起作用
【解决方案3】:

我发现 Gleeson 的解决方案很有效,这对我很有帮助。解决办法是……

  1. 转到 %APPDATA%Roaming\npm\node_modules\protractor\built\driverProviders\
  2. 找到 driverProviders.js
  3. 在记事本或任何其他文本编辑器中打开它
  4. 查找并替换返回 driver.Quit() 以返回 0
  5. 保存文件

之后重新开始测试。

我正在使用 节点 v8.12.0 npm v6.4.1 量角器 v5.4.1

只有在全局安装 npm 或量角器时,此解决方案才有效;如果您已在本地(在您的文件夹中)安装了 npm 或量角器,那么您必须转到本地量角器文件夹并执行相同操作。

【讨论】:

    【解决方案4】:

    建议您在点击操作前使用browser.driver.sleep(500);

    看这个。

    browser.driver.sleep(500);
    
    element(by.css('your button')).click();
    browser.driver.sleep(500);
    

    【讨论】:

    • 我有类似的问题,我使用 browser.sleep(1000);但这并没有解决我的问题,我什至更改了 DEFAULT_TIMEOUT_INTERVAL= 120000;但是在加载页面之前我的所有测试都没有结果!
    • 添加这样的睡眠不是一个好习惯。如果您使用回调函数保持浏览器窗口打开,请参阅以下解决方案
    【解决方案5】:

    It 块中添加一个回调函数,浏览器窗口在您调用它之前不会关闭。 因此,请执行您需要的操作并将回调放在您方便的地方

    var submitBtnElm = $('input[data-behavior=saveContribution]');
      it('Should Search', function(callback) {
        browser.driver.get('http://localhost/enrollments/osda1.html');   
        browser.driver.findElement(by.id('contributePercentValue')).sendKeys(50);
        submitBtnElm.click().then(function() {
           // Have all the logic you need
           // Then invoke callback
           callback();
        });
      });
    

    【讨论】:

      【解决方案6】:

      浏览器暂时不关闭的最佳方法,使用browser.wait()。在等待函数内部编写逻辑来检查元素的可见性()或不可见性(),这是不可见的,或者需要一段时间才能在 UI 上变得不可见。在这种情况下,wait() 会继续检查逻辑,直到满足条件或达到超时。如果您希望浏览器显示更多时间,可以增加超时时间。

      var EC=protractor.ExpectedConditions;
      var submitBtnElm = $('input[data-behavior=saveContribution]');
      
      it('Should Search', function() {
         browser.driver.get('http://localhost/enrollments/osda1.html');   
         browser.driver.findElement(by.id('contributePercentValue')).sendKeys(50);
         submitBtnElm.click().then(function() {
         browser.wait(function(){
                  EC.invisibilityOf(submitBtnElm).call().then(function(isPresent){
                      if(isPresent){
                          return true;
                      }
                  });
              },20000,'error message');
          });
        });
      

      【讨论】:

        【解决方案7】:

        我确定单击按钮会在您的页面上触发更改。它可能像元素上的类更改一样微妙,也可能像显示文本“已保存”的<p></p> 元素一样明显。我要做的是,在测试之后,明确地等待这个变化。

        [...]
        return protractor.browser.wait(function() {
            return element(by.cssContainingText('p', 'Saved')).isPresent();
        }, 10000);
        

        您可以在规范文件的 afterEach() 方法中添加这样的等待机制,这样即使没有 Protractor Angular 隐式等待,您的测试也会分开。

        【讨论】:

          【解决方案8】:
          var submitBtnElm = $('input[data-behavior=saveContribution]');
          
            it('Should Search', function() {
              browser.driver.get('http://localhost/enrollments/osda1.html');   
              browser.driver.findElement(by.id('contributePercentValue')).sendKeys(50);
              submitBtnElm.click().then(function() {
          
              });
              browser.pause(); // it should leave browser alive after test
            });
          

          browser.pause() 应该让浏览器保持活动状态,直到您放手为止。

          @Edit 另一种方法是在 browser.get(...) 之前设置browser.ignoreSynchronization = true。 Protractor 不会等待 Angular 加载,您可以使用通常的 element(...) 语法。

          【讨论】:

            【解决方案9】:

            Protractor 将关闭它创建的浏览器,因此我使用的一种方法是通过 webdriver-reuse-session npm 包启动浏览器。

            免责声明:我是这个包的作者

            这是一个新包,如果它解决了您的问题,请告诉我。我使用它取得了巨大的成功。

            【讨论】:

              猜你喜欢
              • 2017-04-08
              • 2017-04-05
              • 1970-01-01
              • 2020-07-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-08-02
              相关资源
              最近更新 更多