Selenium webdriver 如何使用Selenium处理Cucumber中的多步骤定义文件
我有两个步骤定义文件,在未来,将有多个,我无法执行我的代码注销,其工作良好,为登录和一个步骤定义文件,并不断打开chrome浏览器 我使用page factory创建了一个框架,下面是我的代码: 登录页面:Selenium webdriver 如何使用Selenium处理Cucumber中的多步骤定义文件,selenium-webdriver,cucumber,Selenium Webdriver,Cucumber,我有两个步骤定义文件,在未来,将有多个,我无法执行我的代码注销,其工作良好,为登录和一个步骤定义文件,并不断打开chrome浏览器 我使用page factory创建了一个框架,下面是我的代码: 登录页面: public class LoginPage { WebDriver driver; public LoginPage(WebDriver driver) { //this.driver=driver; PageFactory.initEl
public class LoginPage {
WebDriver driver;
public LoginPage(WebDriver driver) {
//this.driver=driver;
PageFactory.initElements(driver, this);
}
@FindBy(how=How.ID,using="username")
public WebElement usernametexbox;
@FindBy(how=How.ID,using="pass")
public WebElement passwordtextbox;
@FindBy(how=How.ID,using="submit")
public WebElement signin;
@FindBy(how=How.XPATH,using="//button[@class='btn']")
public WebElement acceptbutton;
public void enter_username(String username) {
usernametexbox.clear();
usernametexbox.sendKeys(username);
usernametexbox.getText();
}
public void enter_password(String password) {
passwordtextbox.clear();
passwordtextbox.sendKeys(password);
}
public void clickToSigninbutton() {
signin.click();
}
public void clickToAcceptbutton() {
acceptbutton.click();
}
public void fill_LoginDetails() {
enter_username("abc");
enter_password("def45");
}
}
注销页面:
public class LogoutPage {
WebDriver driver;
public LogoutPage(WebDriver driver) {
//this.driver=driver;
PageFactory.initElements(driver, this);
}
@FindBy(how=How.XPATH,using="//*[@class='icon']")
public WebElement chevron;
@FindBy(how=How.XPATH,using="//a[@class='logout-link']")
public WebElement logoutlink;
public void clickTochevron() {
chevron.click();
}
public void clickToLogoutLink() {
link.click();
}
}
属性文件读取器:
public class PropertiesFileReader {
public Properties getproperty() throws IOException {
FileInputStream inputstream=null;
Properties properties=new Properties();
try {
properties.load(new FileInputStream("resources/config.properties"));
}catch(Exception e) {
System.out.println("Exception " +e);
}
return properties;
}
}
浏览器实用程序:
public class BrowserUtility {
public static WebDriver openBrowser(WebDriver driver, String browserName, String url) throws InterruptedException {
if(browserName.equals("chrome")) {
System.setProperty("webdriver.chrome.driver", "D:\\chromedriver\\chromedriver.exe");
driver=new ChromeDriver();
driver.manage().window().maximize();
driver.get(url);
driver.manage().timeouts().implicitlyWait(50, TimeUnit.SECONDS);
return driver;
}else if(browserName.equals("IE")) {
System.setProperty("webdriver.chrome.driver", "D:\\chromedriver\\chromedriver.exe");
driver=new ChromeDriver();
driver.manage().window().maximize();
driver.get(url);
Thread.sleep(5000);
return driver;
}else if(browserName.equals("Firefox")) {
System.setProperty("webdriver.chrome.driver", "D:\\chromedriver\\chromedriver.exe");
driver=new ChromeDriver();
driver.manage().window().maximize();
driver.get(url);
Thread.sleep(5000);
return driver;
}
return driver;
}
}
登录步骤定义:
public class StepDefinition {
public static WebDriver driver;
// public LoginPage loginpage;
// Properties properties=new Properties();
PropertiesFileReader obj=new PropertiesFileReader();
@Given("^Open browser and enter url$")
public void open_browser_and_enter_url() throws Throwable {
Properties properties=obj.getproperty();
driver= BrowserUtility.openBrowser(driver, properties.getProperty("browser.Name"), properties.getProperty("URL"));
}
@Then("^Enter username and password$")
public void enter_username_and_password() throws Throwable {
LoginPage loginpage=new LoginPage(driver);
loginpage.fill_LoginDetails();
}
@Then("^click on sign in button$")
public void click_on_sign_in_button() throws Throwable {
new LoginPage(driver).clickToSigninbutton();
System.out.println("Sign-In successfully");
}
@Then("^Terms and conditions page open and click on Accept button$")
public void terms_and_conditions_page_open_and_click_on_Accept_button() throws Throwable {
new LoginPage(driver).clickToAcceptbutton();
}
}
注销步骤定义:
public class Logoutstepdef {
public static WebDriver driver;
PropertiesFileReader obj=new PropertiesFileReader();
@Given("^Chevron near username$")
public void chevron_near_username() throws Throwable {
Properties properties=obj.getproperty();
driver= BrowserUtility.openBrowser(driver,
properties.getProperty("browser.Name"), properties.getProperty("URL"));
LogoutPage logoutpage=new LogoutPage(driver);
logoutpage.clickTochevron();
}
@Then("^click on chevron and it should get expands$")
public void click_on_chevron_and_it_should_get_expands() throws
Throwable {
System.out.println("when user click on checvron it should
further expands a window");
}
@Then("^click on Logout link$")
public void click_on_Logout_link() throws Throwable {
new LogoutPage(driver).clickToLogoutLink();
}
}
预期结果:对于不同的步骤定义文件,应用程序应该能够成功地自动化,并且一次只能打开一个浏览器
实际结果:我有两个步骤定义文件,将来会有多个,我无法执行我的代码进行注销,登录和一个步骤定义文件工作正常,它会持续打开chrome浏览器。您的
然后
步骤正在创建页面的另一个实例,这就是为什么要打开多个浏览器
尝试在Logoutstepdef
类中执行此操作:
public class Logoutstepdef {
public static WebDriver driver;
PropertiesFileReader obj=new PropertiesFileReader();
private LogoutPage logoutpage;
.....//the rest remains the same, until:
@Then("^click on Logout link$")
public void click_on_Logout_link() throws Throwable {
logoutpage.clickToLogoutLink();
}
}
也有类似的问题和问题 您的
然后
步骤是创建页面的另一个实例,这就是您打开多个浏览器的原因
尝试在Logoutstepdef
类中执行此操作:
public class Logoutstepdef {
public static WebDriver driver;
PropertiesFileReader obj=new PropertiesFileReader();
private LogoutPage logoutpage;
.....//the rest remains the same, until:
@Then("^click on Logout link$")
public void click_on_Logout_link() throws Throwable {
logoutpage.clickToLogoutLink();
}
}
也有类似的问题和问题 我建议试试。使用QAF,您不需要管理驱动程序,也不需要担心页面。您只需将WebdriverTestPage
扩展到页面类,就完成了。您还可以在Page类本身中包含步骤。例如,使用qaf,您的注销页面可能如下所示:
public类LogoutPage扩展了WebDriverBaseTestPage{
@FindBy(locator=“xpath=/*[@class='icon']”)
公共网络元素雪佛龙;
@FindBy(locator=“xpath=//a[@class='logout-link']”)
公共WebElement logoutlink;
公共作废点击至chevron(){
chevron.click();
}
//@然后(“^click on Logout link$”//您可以使用cucumber或qaf步骤注释
@QAFTestStep(description=“单击注销链接”)
public void clickToLogoutLink(){
link.click();
}
}
浏览器管理(打开/关闭浏览器)由QAF负责,因此根据您的(顺序/并行)QAF将提供线程安全的驱动器会话
此外,使用可以消除页面类的一层。您可以直接使用内置步骤。例如:
注销页面。属性
chevron.icon.loc=xpath=//*[@class='icon']
logout.link.loc=xpath=//a[@class='logout-link']
在BDD中,您可以直接使用内置步骤,如下所示:
Scenario: name of scenario
Given ...
When ...
Then verify 'chevron.icon.loc' is present
And click on 'logout.link.loc'
logout.link.loc=xpath={"locator":"//a[@class='logout-link']","desc":"logout button"}
要使定位器具有自描述性,可以按以下步骤进行操作:
Scenario: name of scenario
Given ...
When ...
Then verify 'chevron.icon.loc' is present
And click on 'logout.link.loc'
logout.link.loc=xpath={"locator":"//a[@class='logout-link']","desc":"logout button"}
该说明将用于报告中,以使其更有意义。
还有许多其他功能对于功能测试自动化至关重要。我建议尝试一下。使用QAF,您不需要管理驱动程序,也不需要担心页面。您只需将WebdriverTestPage
扩展到页面类,就完成了。您还可以在Page类本身中包含步骤。例如,使用qaf,您的注销页面可能如下所示:
public类LogoutPage扩展了WebDriverBaseTestPage{
@FindBy(locator=“xpath=/*[@class='icon']”)
公共网络元素雪佛龙;
@FindBy(locator=“xpath=//a[@class='logout-link']”)
公共WebElement logoutlink;
公共作废点击至chevron(){
chevron.click();
}
//@然后(“^click on Logout link$”//您可以使用cucumber或qaf步骤注释
@QAFTestStep(description=“单击注销链接”)
public void clickToLogoutLink(){
link.click();
}
}
浏览器管理(打开/关闭浏览器)由QAF负责,因此根据您的(顺序/并行)QAF将提供线程安全的驱动器会话
此外,使用可以消除页面类的一层。您可以直接使用内置步骤。例如:
注销页面。属性
chevron.icon.loc=xpath=//*[@class='icon']
logout.link.loc=xpath=//a[@class='logout-link']
在BDD中,您可以直接使用内置步骤,如下所示:
Scenario: name of scenario
Given ...
When ...
Then verify 'chevron.icon.loc' is present
And click on 'logout.link.loc'
logout.link.loc=xpath={"locator":"//a[@class='logout-link']","desc":"logout button"}
要使定位器具有自描述性,可以按以下步骤进行操作:
Scenario: name of scenario
Given ...
When ...
Then verify 'chevron.icon.loc' is present
And click on 'logout.link.loc'
logout.link.loc=xpath={"locator":"//a[@class='logout-link']","desc":"logout button"}
该说明将用于报告中,以使其更有意义。
还有许多其他功能对于功能测试自动化至关重要。
BrowserUtility.openBrowser()
总是打开Chromedriver,而不管浏览器名称如何。(注意:只是注意,还没有试图回答你的问题)。我的问题如果不同,不仅与打开浏览器有关,如果你知道如何处理Cucumber中的多个步骤定义,为什么要注释掉this.driver=driver代码>在页面对象类中?这需要保留,否则如果它工作正常,您将得到非常不可预测的结果。BrowserUtility.openBrowser()
总是打开Chromedriver,而不管浏览器名称如何。(注意:只是注意,还没有试图回答你的问题)。我的问题如果不同,不仅与打开浏览器有关,如果你知道如何处理Cucumber中的多个步骤定义,为什么要注释掉this.driver=driver代码>在页面对象类中?这需要保持不变,否则如果它能正常工作,你会得到非常不可预测的结果。谢谢Mate,它能帮助你停止打开多个浏览器。一旦我成功地通过一个step def文件编写了登录页面和条款与条件页面,并且在logoutstepdef类中编写了注销功能,那么当我执行代码时,第二个浏览器在登录页面停止,测试用例失败,我们不能在cucumber中扩展stepdef,但我们可以使用picocontainer。您知道如何使用picocontainer集成第一步def,然后使用第二步执行端到端测试。如果您觉得有用,可以对答案进行投票。你还有其他问题吗?谢谢,伙计,停止打开多个浏览器会有很大帮助。一旦我成功地能够自动登录页面和条款和条件页面,虽然它写在一个步骤def文件,并注销f