黄瓜版本: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)
正如brasmusson(https://github.com/cucumber/cucumber-jvm/issues/1303)所回答
“在钩子的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,则不要在挂钩前的Scenario参数上调用write。“
这就是我想出来的:
黄瓜报告会生成一些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"
});
});
这是黄瓜的虫子吗?