Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Selenium 在cucumber项目中使用另一类方法的体系结构问题_Selenium_Cucumber - Fatal编程技术网

Selenium 在cucumber项目中使用另一类方法的体系结构问题

Selenium 在cucumber项目中使用另一类方法的体系结构问题,selenium,cucumber,Selenium,Cucumber,我最近加入了使用Cucumber和Selenium的自动化测试Java项目。 它用于测试web应用程序。项目结构分为3层: 功能文件—包含黄瓜测试场景和步骤 粘合文件-绑定步骤和调用Java方法 页面文件-包含引用网页元素和访问这些元素的方法的字段 每个粘合文件都有一个方法,该方法带有@Before标记和@附加的标记,以使该方法在相应功能文件中的每个测试场景之前执行。相应的功能文件还使用@附加的标记来知道应该调用哪个@方法之前。在每个带有@Before标记的方法中,都有一组行,用于初始化某些

我最近加入了使用Cucumber和Selenium的自动化测试Java项目。 它用于测试web应用程序。项目结构分为3层:

  • 功能文件—包含黄瓜测试场景和步骤
  • 粘合文件-绑定步骤和调用Java方法
  • 页面文件-包含引用网页元素和访问这些元素的方法的字段
每个粘合文件都有一个方法,该方法带有
@Before
标记和
@附加的
标记,以使该方法在相应功能文件中的每个测试场景之前执行。相应的功能文件还使用
@附加的
标记来知道应该调用哪个
@方法之前。在每个带有
@Before
标记的方法中,都有一组行,用于初始化某些页面文件对象,例如:

黄瓜档案:

@DesignPage
Scenario: some example scenario
Given HI im cucumber step method
粘合文件:

@Before @DesignPage
public someBeforeMethod(){
...
designPage = new DesignPage();
managmentPage = new ManagmentPage();
...
lateron,glue files具有cucumber步骤的方法定义,它从页面文件调用一些方法,例如:

@Given("HI im cucumber step method")
public void HiImCucumberMethod(){
designPage.executeSomeDesignPageMethod();
} 
到目前为止,一切都很顺利

现在假设我有另一个(@MainPage)功能文件,但我想从(DesignPage)功能执行完全相同的方法:

Cucumber从这里看到,
HI im cucucumber step method
已在
DesignPage
glue文件中声明,因此我想重用此方法。不幸的是,我将收到NullPointerException,原因很清楚<此方法中使用的code>designPage
对象从未初始化,因为我从未从
designPage
glue文件中执行
@之前的
方法。原因是在这个场景中,我只从不同的粘合文件执行了
@Before
方法-
MainPage
glue文件

这种架构让我有点恼火,因为唯一的解决方案是将paste
HI-im cucumber step method
方法从DesignPage glue文件复制到MainPage glue文件,在
MainPage
@类之前初始化design page对象,然后我还必须重命名
HI-im cucumber step method
,因为Cucumber现在看到了两种引用相同的方法,它不知道应该使用哪一种


我花了一些时间在这上面,我不知道如何改变体系结构,以便能够从一个特性重用另一个特性。任何建议都将受到欢迎。

我的看法是:给定的HI im CURCURE step方法的
当前步骤定义只初始化页面对象的实例,并且需要在每个测试场景之前执行该步骤。如果是真的,那么也许你应该考虑在 HOK之前把它移到<代码>。根据文档,它实际上是设计用来在场景出现之前进行一些技术设置的

对于只阅读特征的人来说,Before钩子中发生的任何事情都是看不见的。您应该考虑使用背景作为更明确的替代方案,特别是如果安装程序应该由非技术人员阅读。对于低级逻辑,例如启动浏览器或从数据库中删除数据,只能使用Before钩子


了解更多信息:

尝试在方法定义内而不是在before方法内初始化对象。像这样的

Class GlueFile
{
    DesignPage designPage;
    ManagmentPage managmentPage;

 @Before @DesignPage
 public someBeforeMethod(){
 ...
 }
 @Given("HI im cucumber step method")
 public void HiImCucumberMethod(){
 designPage = new DesignPage();
 managmentPage = new ManagmentPage();
 designPage.executeSomeDesignPageMethod();
 } 

}

不幸的是,它不起作用。Nullpointerexception仍在生成中。因此,您有两个页面对象文件DesignPage和MainPage,以及一个带有步骤定义的粘合文件和两个不同的功能文件design和Main?您是否可以尝试初始化步骤定义中的对象,就像我在answer中编辑的那样,或者尝试将其设置为静态。如果我理解正确,您建议在@Before方法中初始化页面对象。如果您在metod之前查看我的示例,您将看到对象实际上是在那里初始化的。Step方法只使用已经初始化的对象,这就是为什么我有这个nullpointerexception问题。不,我建议在钩子中初始化页面对象,而不是像您这样的步骤。请看一看我链接的文档,如果还不清楚,我会详细说明。你是如何做到的:我只执行了来自不同粘合文件-主页粘合文件的@Before方法。你能共享主页粘合文件代码吗?
Class GlueFile
{
    DesignPage designPage;
    ManagmentPage managmentPage;

 @Before @DesignPage
 public someBeforeMethod(){
 ...
 }
 @Given("HI im cucumber step method")
 public void HiImCucumberMethod(){
 designPage = new DesignPage();
 managmentPage = new ManagmentPage();
 designPage.executeSomeDesignPageMethod();
 } 

}