【问题标题】:E2E Testing - WebdriverJS, Selenium and JasmineE2E 测试 - WebdriverJS、Selenium 和 Jasmine
【发布时间】:2023-04-01 07:01:02
【问题描述】:

好的,所以我遵循了几个略有不同的示例,您可以在下面的注释代码中看到。他们都声称可以工作,但我无法做到。

我正在使用; - selenium-webdriver - jasmine-node-reporter-fixjasmine-node 错误)

所以这是一个相当简单的异步测试,打开谷歌并搜索,然后获取页面标题。

问题; 返回的页面标题是 Google 主页,而不是搜索结果页面。 (浏览器最终出现在搜索结果页面上)。

代码

var webdriver = require('selenium-webdriver');

var driver = new webdriver.Builder().
    withCapabilities(webdriver.Capabilities.firefox()).
    build();

jasmine.DEFAULT_TIMEOUT_INTERVAL = 9999999;

describe('basic test', function () {

    it('should be on correct page', function (done) {
        //driver.get('http://www.wingify.com');
        //driver.getTitle().then(function (title) {
        //  expect(title).toBe('Wingify');
        //  // Jasmine waits for the done callback to be called before proceeding to next specification.
        //  done();
        //});


        driver.get("http://www.google.com");
        driver.findElement(webdriver.By.name("q")).sendKeys("webdriver");
        driver.findElement(webdriver.By.name("btnG")).click();
        //driver.getTitle().then(function (title) {
        //  console.log(title);
        //  console.log(expect);
        //  expect(title).toBe('webdriver - Google Search');
        //  done();
        //});
        driver.wait(function () {
            driver.getTitle().then(function (title) {
                expect(title).toBe('webdriver - Google Search');
                done();
            });
        }, 5000);

    });
});

结果

Failures:

  1) basic test should be on correct page
   Message:
     Expected 'Google' to be 'webdriver - Google Search'.
   Stacktrace:
     Error: Expected 'Google' to be 'webdriver - Google Search'.
    at C:\Stash\Will-Hancock\grunt-jasmine\spec\test-spec.js:31:19
    at C:\Stash\Will-Hancock\grunt-jasmine\node_modules\selenium-webdriver\lib\goog\base.js:1243:15
    at webdriver.promise.ControlFlow.runInNewFrame_ (C:\Stash\Will-Hancock\grunt-jasmine\node_modules\selenium-webdriver\lib\webdriver\promise.js:1539
:20)
    at notify (C:\Stash\Will-Hancock\grunt-jasmine\node_modules\selenium-webdriver\lib\webdriver\promise.js:362:12)
    at notifyAll (C:\Stash\Will-Hancock\grunt-jasmine\node_modules\selenium-webdriver\lib\webdriver\promise.js:331:7)
    at resolve (C:\Stash\Will-Hancock\grunt-jasmine\node_modules\selenium-webdriver\lib\webdriver\promise.js:309:7)
    at fulfill (C:\Stash\Will-Hancock\grunt-jasmine\node_modules\selenium-webdriver\lib\webdriver\promise.js:429:5)
    at Object.webdriver.promise.asap (C:\Stash\Will-Hancock\grunt-jasmine\node_modules\selenium-webdriver\lib\webdriver\promise.js:671:5)

Finished in 4.281 seconds
1 test, 1 assertion, 1 failure, 0 skipped

所以有人说我需要延长茉莉花的超时时间,这没什么区别。

其他人说你需要 Jasmine done() 方法 - 没有这个,测试就不会完成。

我不明白为什么等待不等待! - 无论提供什么超时,结果都会立即返回。

【问题讨论】:

    标签: javascript selenium selenium-webdriver jasmine integration-testing


    【解决方案1】:

    this answer - “内部函数将返回一个驱动程序等待的承诺,并将其值(真/假)作为等待条件”

    您应该应用的更改是 -

    driver.wait(function () {
                return driver.getTitle().then(function (title) {
                    return title === 'webdriver - Google Search';
                });
            }, 5000);
    

    【讨论】:

    • 所以进行建议的更改...失败:1) 基本测试应该在正确的页面上消息:超时:在等待规范完成 5000 毫秒后超时 Stacktrace:未定义在 7.855 秒内完成 1 次测试, 1 个断言,1 个失败,0 个跳过。我想这是因为我们不再告诉茉莉它完成了。而且没有断言......我们如何将值返回给茉莉花?
    • 你不需要 done 回调。从 it 回调中删除它。
    【解决方案2】:

    所以,上面的问题是我无法让 Jasmine 在执行断言之前等待页面加载,使用 driver.wait。

    Jasmine 在 driver.wait 返回之前完成。

    我使用 Jasmine 的 waitsFor() 方法。

    var webdriver = require('selenium-webdriver');
    
    var driver = new webdriver.Builder().
        withCapabilities(webdriver.Capabilities.chrome()).
        build();
    
    describe('basic test', function () {
    
        it('should be on correct page', function () {
            var match = 'webdriver - Google Search',
                title = '';
    
            driver.get("http://www.google.com");
            driver.findElement(webdriver.By.name("q")).sendKeys("webdriver");
            driver.findElement(webdriver.By.name("btnG")).click();
    
            // wait for page title, we know we are there
            waitsFor(function () {
                driver.getTitle().then(function (_title) {
                    title = _title;
                });
                return title === match;
            }, 'Test page title, so we know page is loaded', 6000);
    
            // test title is correct
            runs(function () {
                expect(title).toEqual(match);
            });
        });
    });
    

    【讨论】:

      【解决方案3】:

      就像您在自己的回答中所说的那样,问题在于您没有等待页面加载。我真的不喜欢 driver.wait 的方法名称,因为它暗示它会在继续之前等待指定的时间,但事实并非如此。如果您的承诺没有解决,这只是一个超时。要等待,您应该使用 driver.sleep(1000)。然后您可以添加您的期望,如下所示:

      driver.sleep(1000).then(function () {
         return driver.getTitle().then(function (title) {
             expect(title).toBe('webdriver - Google Search');
             done();
         });
      });
      

      (由于您在问题中使用 done,我假设 Jasmine 2.0 和 done

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2021-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多