在Cucumber jvm中,如果我们有多个场景,并且有任何选项可以在一个实例中执行所有场景。我的意思是打开浏览器一次并执行所有方案,而不是为每个方案打开和关闭浏览器。
我在钩子文件中尝试使用BeforeAll但是它抛出了Nullpointer异常。
这是我的代码。我需要转到URL,使用凭据登录并在同一个实例中执行这两个场景。
MaharaTest.feature
Feature: MaharaTest
Scenario: Creating Profile
Given I navigate to Content Tab
And I enter firstname
And I enter lastname
And I click save profile
Then I see profile saved successful message
Scenario: Creating Profile
Given I navigate to Portfolio Tab
And I click create page
And I enter page title
And I click save page
Then I see page saved successful message
MaharaTest.java
public class MaharaTest {
public WebDriver driver;
public MaharaTest() {
driver = Hooks.driver;
}
@Given("^I navigate to Content Tab$")
public void navigate_to_content() {
driver.findElement(By.linkText("Content")).click();
}
@And("^I enter firstname$")
public void enter_firstname() {
driver.findElement(By.id("profileform_firstname")).clear();
driver.findElement(By.id("profileform_firstname")).sendKeys("Test");
}
@And("^I enter lastname$")
public void enter_lastname() {
driver.findElement(By.id("profileform_lastname")).clear();
driver.findElement(By.id("profileform_lastname")).sendKeys("User");
}
@And("^I click save profile$")
public void click_save() {
driver.findElement(By.id("profileform_submit")).click();
}
@Then("^I see profile saved successful message$")
public void profile_success_message() {
assertEquals("Profile saved successfully",
driver.findElement(By.className("alert-success")).getText());
}
@Given("^I navigate to Portfolio Tab$")
public void navigate_to_portfolio() {
driver.findElement(By.linkText("Portfolio")).click();
}
@And("^I click create page$")
public void create_page() {
driver.findElement(By.id("createview_submit")).click();
}
@And("^I enter page title$")
public void enter_page_title() {
driver.findElement(By.id("editview_title")).clear();
driver.findElement(By.id("editview_title")).sendKeys("Test_Profile");
}
@And("^I click save page$")
public void click_save_page() {
driver.findElement(By.id("editview_submit")).click();
}
@Then("^I see page saved successful message$")
public void page_success_message() {
assertEquals("Page saved successfully",
driver.findElement(By.className("alert-success")).getText());
}
}
Hooks.java
public class Hooks {
public static WebDriver driver;
@Before
public void openBrowser() throws MalformedURLException {
System.out.println("Called openBrowser");
driver = new FirefoxDriver();
driver.manage().window().maximize();
driver.get("http://demo.mahara.org/");
driver.findElement(By.id("login_login_username")).sendKeys("student1");
driver.findElement(By.id("login_login_password")).sendKeys("Testing1");
driver.findElement(By.id("login_submit")).click();
}
@After
public void embedScreenshot(Scenario scenario) {
if (scenario.isFailed()) {
try {
scenario.write("Current Page URL is " + driver.getCurrentUrl());
byte[] screenshot = ((TakesScreenshot) driver)
.getScreenshotAs(OutputType.BYTES);
scenario.embed(screenshot, "image/png");
} catch (WebDriverException somePlatformsDontSupportScreenshots) {
System.err.println(somePlatformsDontSupportScreenshots
.getMessage());
}
}
driver.quit();
}
}
答案 0 :(得分:0)
首先,你似乎想要在这里做两件事
创建个人资料 创建投资组合页面
我假设除非您创建了个人资料,否则无法创建投资组合页面。
一种方法是:
Scenario: Create a profile
When I create a profile
Then I should see my new profile
这应该足以推动创建配置文件的开发。一旦你可以创建一个配置文件,你就可以
Scenario: Create portfolio page
Given I have a profile
When I create a portfolio page
Then I should see my new portfolio page
您可以通过两种方式实施Given I have a profile
执行您使用的When you created a profile
完全相同的代码,即通过用户界面。
找到一种更快的方法来创建相同的效果(通常绕过用户界面)
如果你想要一套快速的功能,你将采用第二种方法。
有些注意事项:
没有必要详细说明您在场景中如何创建个人资料/页面。场景应该是关于什么以及为什么不是如何,所以没有点击按钮或填写字段(留下步骤defs)
因为我们写得非常快(鉴于我有个人资料),我们可以大量使用它并丢失方案,而不用担心需要多长时间。