【问题标题】:Cucumber generates blank html reportCucumber 生成空白 html 报告
【发布时间】:2017-12-14 16:20:14
【问题描述】:

黄瓜版本:1.2.5

特点:

@SSS

Feature: Login

  Scenario: Login And Logout

    * UI Login with user "moaada" and password "moaada12"
    * UI Logout

我正在使用 junit 运行功能文件:

@RunWith(Cucumber.class)
@CucumberOptions(
        format = {"pretty", "html:target/cucumber", "json:target/cucumber.json"},
        glue = {"com.webuiauto.bddtests"},
        features = {"src/test/resources/Features"},
        strict = true,
        tags = {"@SSS"})
public class RunViBddTests {
}

在浏览器中打开index.html 文件后,我什么也看不到;只是一个空白页。我在浏览器上进行了检查,在控制台中出现以下错误:

formatter.js:112 Uncaught TypeError: Cannot read property 'append' of undefined
    at CucumberHTML.DOMFormatter.write (formatter.js:112)
    at HTMLDocument.<anonymous> (report.js:15)
    at k (jquery-1.8.2.min.js:2)
    at Object.fireWith [as resolveWith] (jquery-1.8.2.min.js:2)
    at Function.ready (jquery-1.8.2.min.js:2)
    at HTMLDocument.D (jquery-1.8.2.min.js:2)

【问题讨论】:

  • 不确定来自浏览器控制台的此错误是否有帮助。更有用的是 IDE 控制台中的输出。您可以将其添加到您的问题中吗?您是否还可以添加一个您尝试运行的功能文件的示例。
  • 在 ide 控制台上没有看到任何可疑的东西来分享它的时间太长,我已经添加了功能文件。

标签: javascript java selenium-webdriver automation cucumber-jvm


【解决方案1】:

由布拉斯穆森 (https://github.com/cucumber/cucumber-jvm/issues/1303) 回答

"在 hook 的 Scenario 参数上调用 write 将在 report.js 文件中添加一个 formatter.write 调用。https://github.com/cucumber/cucumber-html 的 javascripts 函数将在上一步下方显示 formatter.write 调用的内容。对于在执行第一个场景的钩子之前,不存在任何前面的步骤,因为还没有执行(小黄瓜)步骤,因此从此时起报告将是空白的(对于来自后续场景的钩子之前的 formatter.write 调用,内容会显示在前面场景最后一步的下方,这是不正确的,但报告至少不会是空白的)。

要解决此问题,需要更新 https://github.com/cucumber/cucumber-html 项目。但是,由于计划是替换该项目,请参阅 cucumber/cucumber-html#44,我不确定核心团队中的任何人是否会承担这项工作。

如果使用了 html-formatter,解决方法是不要在 before 钩子的 Scenario 参数上调用 write。"

【讨论】:

    【解决方案2】:

    这是我想出来的:

    Cucumber 报告生成一些 js 文件,问题在 report.js 中

    这就是它的样子:

    $(document).ready(function() {var formatter = new CucumberHTML.DOMFormatter($('.cucumber-report'));formatter.uri("test.feature");
        formatter.feature({
          "line": 3,
          "name": "Login",
          "description": "",
          "id": "login",
          "keyword": "Feature",
          "tags": [
            {
              "line": 1,
              "name": "@SSS"
            }
          ]
        });
        **formatter.write("11:43:49: WebDriver navigating to:\u0027https://1.1.1.1/\u0027");**
        formatter.before({
          "duration": 16696372480,
          "status": "passed"
        });
        formatter.before({
          "duration": 93668,
          "status": "passed"
        });
        formatter.scenario({
          "line": 5,
          "name": "Login And Logout",
          "description": "",
          "id": "login;login-and-logout",
          "type": "scenario",
          "keyword": "Scenario"
        });
        formatter.step({
          "line": 7,
          "name": "UI Login with user \"moaada\" and password \"moaada12\"",
          "keyword": "* "
        });
        formatter.step({
          "line": 8,
          "name": "UI Logout",
          "keyword": "* "
        });
        formatter.match({
          "arguments": [
            {
              "val": "moaada",
              "offset": 20
            },
            {
              "val": "moaada12",
              "offset": 42
            }
          ],
          "location": "BasicOperationsSteps.login(String,String)"
        });
        formatter.write("11:43:59: Finding web element By.id: gwt-debug-Dialog_Box");
        formatter.write("11:43:59: Web element found By.id: gwt-debug-Dialog_Box");
        formatter.write("11:43:59: Finding web element By.id: gwt-debug-Login_UserName");
        formatter.write("11:43:59: Web element found By.id: gwt-debug-Login_UserName");
        formatter.write("11:43:59: WebDriver changing value in element found By.id: gwt-debug-Login_UserName from \u0027\u0027 to \u0027\u0027");
        formatter.write("11:43:59: WebDriver changing value in element found By.id: gwt-debug-Login_UserName from \u0027\u0027 to \u0027moaada\u0027");
        formatter.write("11:43:59: Finding web element By.id: gwt-debug-Dialog_Box");
        formatter.write("11:43:59: Web element found By.id: gwt-debug-Dialog_Box");
        formatter.write("11:43:59: Finding web element By.id: gwt-debug-Login_Password");
        formatter.write("11:43:59: Web element found By.id: gwt-debug-Login_Password");
        formatter.write("11:43:59: WebDriver changing value in element found By.id: gwt-debug-Login_Password from \u0027\u0027 to \u0027\u0027");
        formatter.write("11:43:59: WebDriver changing value in element found By.id: gwt-debug-Login_Password from \u0027\u0027 to \u0027moaada12\u0027");
        formatter.write("11:43:59: Finding web element By.id: gwt-debug-userInfo");
        formatter.write("11:43:59: Web element found By.id: gwt-debug-userInfo");
        formatter.write("11:44:00: Finding web element By.id: gwt-debug-userInfo");
        formatter.write("11:44:00: Web element found By.id: gwt-debug-userInfo");
        formatter.write("11:44:00: Finding web element By.id: gwt-debug-DeviceControlBar_Help");
        formatter.write("11:44:00: Web element found By.id: gwt-debug-DeviceControlBar_Help");
        formatter.embedding("image/png", "embedded0.png");
        formatter.write("11:44:01: 11:44:00 Screenshot. Locator: By.id: gwt-debug-userInfo");
        formatter.result({
          "duration": 3237037562,
          "status": "passed"
        });
        formatter.match({
          "location": "BasicOperationsSteps.logout()"
        });
        formatter.write("11:44:02: Finding web element By.id: gwt-debug-userInfo");
        formatter.write("11:44:02: Web element found By.id: gwt-debug-userInfo");
        formatter.write("11:44:02: Clicking on td");
        formatter.write("11:44:02: Finding web element By.xpath: .//div[contains(@id,\u0027gwt-debug-Dialog_Box\u0027) and contains(@class,\u0027MessagesFrame\u0027)]");
        formatter.write("11:44:02: Web element found By.xpath: .//div[contains(@id,\u0027gwt-debug-Dialog_Box\u0027) and contains(@class,\u0027MessagesFrame\u0027)]");
        formatter.write("11:44:02: Finding web element By.id: gwt-debug-Global_Logout-0-0");
        formatter.write("11:44:02: Web element found By.id: gwt-debug-Global_Logout-0-0");
        formatter.write("11:44:02: Clicking on td");
        formatter.write("11:44:02: Finding web element By.xpath: .//div[contains(@id,\u0027gwt-debug-Dialog_Box\u0027) and contains(@class,\u0027MessagesFrame\u0027)]");
        formatter.write("11:44:02: Web element found By.xpath: .//div[contains(@id,\u0027gwt-debug-Dialog_Box\u0027) and contains(@class,\u0027MessagesFrame\u0027)]");
        formatter.embedding("image/png", "embedded1.png");
        formatter.write("11:44:03: 11:44:02 Screenshot. Locator: By.xpath: .//div[contains(@id,\u0027gwt-debug-Dialog_Box\u0027) and contains(@class,\u0027MessagesFrame\u0027)]");
        formatter.write("11:44:03: Finding web element By.xpath: .//div[contains(@id,\u0027gwt-debug-Dialog_Box\u0027) and contains(@class,\u0027MessagesFrame\u0027)]");
        formatter.write("11:44:12: Web element found By.xpath: .//div[contains(@id,\u0027gwt-debug-Dialog_Box\u0027) and contains(@class,\u0027MessagesFrame\u0027)]");
        formatter.embedding("image/png", "embedded2.png");
        formatter.write("11:44:12: 11:44:12 Screenshot. Locator: By.xpath: .//div[contains(@id,\u0027gwt-debug-Dialog_Box\u0027) and contains(@class,\u0027MessagesFrame\u0027)]");
        formatter.result({
          "duration": 13063106597,
          "status": "passed"
        });
        formatter.after({
          "duration": 173543,
          "status": "passed"
        });
        formatter.after({
          "duration": 45551,
          "status": "passed"
        });
        });
    

    我选了这条线:formatter.write("11:43:49: WebDriver navigating to:\u0027https://1.1.1.1/\u0027");

    并将其放在第二个 formatter.write 之前

    所以文件应该是这样的:

    $(document).ready(function() {var formatter = new CucumberHTML.DOMFormatter($('.cucumber-report'));formatter.uri("test.feature");
    formatter.feature({
      "line": 3,
      "name": "Login",
      "description": "",
      "id": "login",
      "keyword": "Feature",
      "tags": [
        {
          "line": 1,
          "name": "@SSS"
        }
      ]
    });
    
    formatter.before({
      "duration": 16696372480,
      "status": "passed"
    });
    formatter.before({
      "duration": 93668,
      "status": "passed"
    });
    formatter.scenario({
      "line": 5,
      "name": "Login And Logout",
      "description": "",
      "id": "login;login-and-logout",
      "type": "scenario",
      "keyword": "Scenario"
    });
    formatter.step({
      "line": 7,
      "name": "UI Login with user \"moaada\" and password \"moaada12\"",
      "keyword": "* "
    });
    formatter.step({
      "line": 8,
      "name": "UI Logout",
      "keyword": "* "
    });
    formatter.match({
      "arguments": [
        {
          "val": "moaada",
          "offset": 20
        },
        {
          "val": "moaada12",
          "offset": 42
        }
      ],
      "location": "BasicOperationsSteps.login(String,String)"
    });
    **formatter.write("11:43:49: WebDriver navigating to:\u0027https://1.1.1.1/\u0027");**
    formatter.write("11:43:59: Finding web element By.id: gwt-debug-Dialog_Box");
    formatter.write("11:43:59: Web element found By.id: gwt-debug-Dialog_Box");
    formatter.write("11:43:59: Finding web element By.id: gwt-debug-Login_UserName");
    formatter.write("11:43:59: Web element found By.id: gwt-debug-Login_UserName");
    formatter.write("11:43:59: WebDriver changing value in element found By.id: gwt-debug-Login_UserName from \u0027\u0027 to \u0027\u0027");
    formatter.write("11:43:59: WebDriver changing value in element found By.id: gwt-debug-Login_UserName from \u0027\u0027 to \u0027moaada\u0027");
    formatter.write("11:43:59: Finding web element By.id: gwt-debug-Dialog_Box");
    formatter.write("11:43:59: Web element found By.id: gwt-debug-Dialog_Box");
    formatter.write("11:43:59: Finding web element By.id: gwt-debug-Login_Password");
    formatter.write("11:43:59: Web element found By.id: gwt-debug-Login_Password");
    formatter.write("11:43:59: WebDriver changing value in element found By.id: gwt-debug-Login_Password from \u0027\u0027 to \u0027\u0027");
    formatter.write("11:43:59: WebDriver changing value in element found By.id: gwt-debug-Login_Password from \u0027\u0027 to \u0027moaada12\u0027");
    formatter.write("11:43:59: Finding web element By.id: gwt-debug-userInfo");
    formatter.write("11:43:59: Web element found By.id: gwt-debug-userInfo");
    formatter.write("11:44:00: Finding web element By.id: gwt-debug-userInfo");
    formatter.write("11:44:00: Web element found By.id: gwt-debug-userInfo");
    formatter.write("11:44:00: Finding web element By.id: gwt-debug-DeviceControlBar_Help");
    formatter.write("11:44:00: Web element found By.id: gwt-debug-DeviceControlBar_Help");
    formatter.embedding("image/png", "embedded0.png");
    formatter.write("11:44:01: 11:44:00 Screenshot. Locator: By.id: gwt-debug-userInfo");
    formatter.result({
      "duration": 3237037562,
      "status": "passed"
    });
    formatter.match({
      "location": "BasicOperationsSteps.logout()"
    });
    formatter.write("11:44:02: Finding web element By.id: gwt-debug-userInfo");
    formatter.write("11:44:02: Web element found By.id: gwt-debug-userInfo");
    formatter.write("11:44:02: Clicking on td");
    formatter.write("11:44:02: Finding web element By.xpath: .//div[contains(@id,\u0027gwt-debug-Dialog_Box\u0027) and contains(@class,\u0027MessagesFrame\u0027)]");
    formatter.write("11:44:02: Web element found By.xpath: .//div[contains(@id,\u0027gwt-debug-Dialog_Box\u0027) and contains(@class,\u0027MessagesFrame\u0027)]");
    formatter.write("11:44:02: Finding web element By.id: gwt-debug-Global_Logout-0-0");
    formatter.write("11:44:02: Web element found By.id: gwt-debug-Global_Logout-0-0");
    formatter.write("11:44:02: Clicking on td");
    formatter.write("11:44:02: Finding web element By.xpath: .//div[contains(@id,\u0027gwt-debug-Dialog_Box\u0027) and contains(@class,\u0027MessagesFrame\u0027)]");
    formatter.write("11:44:02: Web element found By.xpath: .//div[contains(@id,\u0027gwt-debug-Dialog_Box\u0027) and contains(@class,\u0027MessagesFrame\u0027)]");
    formatter.embedding("image/png", "embedded1.png");
    formatter.write("11:44:03: 11:44:02 Screenshot. Locator: By.xpath: .//div[contains(@id,\u0027gwt-debug-Dialog_Box\u0027) and contains(@class,\u0027MessagesFrame\u0027)]");
    formatter.write("11:44:03: Finding web element By.xpath: .//div[contains(@id,\u0027gwt-debug-Dialog_Box\u0027) and contains(@class,\u0027MessagesFrame\u0027)]");
    formatter.write("11:44:12: Web element found By.xpath: .//div[contains(@id,\u0027gwt-debug-Dialog_Box\u0027) and contains(@class,\u0027MessagesFrame\u0027)]");
    formatter.embedding("image/png", "embedded2.png");
    formatter.write("11:44:12: 11:44:12 Screenshot. Locator: By.xpath: .//div[contains(@id,\u0027gwt-debug-Dialog_Box\u0027) and contains(@class,\u0027MessagesFrame\u0027)]");
    formatter.result({
      "duration": 13063106597,
      "status": "passed"
    });
    formatter.after({
      "duration": 173543,
      "status": "passed"
    });
    formatter.after({
      "duration": 45551,
      "status": "passed"
    });
    });
    

    这是黄瓜的 bug 吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-15
      • 1970-01-01
      • 1970-01-01
      • 2023-01-31
      • 1970-01-01
      • 2023-02-09
      • 2019-05-15
      相关资源
      最近更新 更多