黄瓜版本: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)
答案 0 :(得分:1)
由brasmusson(https://github.com/cucumber/cucumber-jvm/issues/1303)
回答“在钩子的Scenario参数上调用write会在report.js文件中添加一个formatter.write调用。https://github.com/cucumber/cucumber-html的javascripts函数将在前一步骤下面显示formatter.write调用的内容对于执行第一个场景的钩子之前,没有任何前面的步骤,因为还没有执行(小黄瓜)步骤,因此从此时开始报告将是空白的(对于后续钩子之前的格式化.write调用方案,内容将显示在上一个方案的最后一步下面,这是不正确的,但报告至少不会是空白的。)
要解决此问题,需要更新https://github.com/cucumber/cucumber-html项目。但是,由于计划是取代该项目,请参阅cucumber / cucumber-html#44,我不确定核心团队中的任何人是否会接受这项工作。
如果使用html-formatter,解决方法是不在挂钩前的Scenario参数上调用write。“
答案 1 :(得分:0)
这就是我想到的:
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"
});
});
这是黄瓜的错误吗?