如何为 <noscript> 标签编写自动化测试?

How to write automated tests for the <noscript> tag?

我正在构建一个网络应用程序,如果 Javascript 被禁用,它会返回到 <noscript> 标签。我想验证该标签是否显示,但我不确定如何使用我拥有的任何框架或任何一般框架来执行此操作。

禁用 Javascript 时,相关应用默认显示以下内容:

 <div>
  <noscript>
    <h1>Javascript Disabled</h1>
    Use this page to show content when Javascript has been disabled
  </noscript>
 </div>

应用程序在加载脚本时将上面的内容替换为以下内容:

 <div>
   Hello World
 </div>

现在为了测试我正在使用 NightmareJS 和 Testem with jasmine。我不必使用它们,但如果可能的话,我仍想使用 Javascript。

我在这里完全被难住了,甚至不知道我该从哪里开始——所有的 Whosebug 问题似乎都是关于如何使用 <noscript>,而不是端到端或验证它单元测试(以自动化方式)。

NightmareJS uses Electron under the hood to run the tests which doesn't seem to support passing a flag 禁用 Javascript,尽管我必须警告你我没有深入挖掘。

... I'm using NightmareJS and Testem with jasmine. I don't have to be using those, but I'd like to still use javascript if possible.

另一个解决方案是使用 NightwatchJS instead of NightmareJS, which is a testing framework that uses ChromeDriver 来驱动测试,它允许通过将首选项传递给 Chromium 来禁用 JS。

我写了一个 sample project 作为一个非常基本的例子,说明如何 运行 在禁用 JS 的情况下进行 NightwatchJS 测试。

该项目使用以下配置来禁用JS:

nightwatch.json

{
  "test_settings" : {
    "default" : {
      "desiredCapabilities": {
        "browserName": "chrome",
        "chromeOptions" : {
          "prefs" : {
            "profile.managed_default_content_settings.javascript": 2
          }
        }
      }
    }
  }
}

在上面的配置中,这是传递给 Chromium 的这一行,它暗示我们希望在 NighwatchJS 运行s 测试时禁用 JS:

"profile.managed_default_content_settings.javascript": 2

话虽如此,我建议您在 Nightmare 的 documentation/issues 中更深入地挖掘一下,以检查您是否可以通过 NightmareJS 传递上述首选项,而不是为了这个小怪癖在 NightwatchJS 中重写所有测试。

对于那些使用 Nightmare JS 的人来说,在创建 nightmare 实例时有一个选项,但是某些功能似乎无法 运行(例如 evaluate,或 exists ).在我的例子中,我将页面保存为 HTML,然后验证 HTML 是否存在。也可以保存屏幕截图或 pdf,以验证输出是否正确。

const nightmare = require('nightmare')
const fs = require('fs')

const browser = nightmare({
  webPreferences: {
    javascript: false
  }
})

describe('Page with Javascript Off', () => {
  beforeAll((done) => {
    browser.goto('http://localhost:8080')
      .html('./tests/no-js-result.html', 'HTMLOnly')
      .then(() => done())
  })
  it('should show page when JS is disabled', (done) => {
    fs.readFile('./tests/no-js-result.html', 'utf8', function(err, html){
      if (err) fail('Could not read no-js-result.html')
      expect(html).toContain('<h1>Javascript Disabled</h1>')
      done()
    })
  })
})