如何使用Selenium中特征文件中的步骤定义文件中定义的java函数(步骤)的返回值

问题描述 投票:0回答:1

所以我有 Selenium 代码,并且我在步骤定义文件中定义了步骤,在这里我返回我们从 chrome 控制台获取的 appId 的值,然后我们需要在我们的功能文件中使用它:

@And("we get appId from console"){
public String weGetAppIdfromConsole() {
    JavaScriptExecutor executor=(JavascriptExecutor)driver;
    String appId = (String)executor.executeScript("return page_data.application_id");
    System.out.println(appId);

    return appId;
}

现在我需要在我的功能文件中使用这个返回的appId:

When we fill in following details:
|applicationId| text| Here I need to pass the appId|

如何实现这一目标?

我尝试直接使用appId:

When we fill in following details:
|applicationId| text | appId|

它在 applicationId 字段中打印 appId,而不是返回的 appId。例如返回的 appId 是 'SUMI1234' ,它在 applicationId 字段中打印 'appId' 。

java selenium-webdriver cucumber cucumber-java selenium-java
1个回答
0
投票

有几种方法可以实现所需的行为。

其中之一是使用“State”在步骤之间共享数据。这种方式是最常见的,在我看来也是最正确的一种。请参阅本文了解总体思路。简而言之,您的步骤定义方法不应返回任何值,而应将值放入状态,该状态可以从另一个步骤定义访问。

另一种方法是实现所谓的“变量”功能。它可能看起来有点麻烦并且不符合 bdd,但它仍然可以在步骤之间共享一些数据。
这种方法背后的主要思想类似于“状态共享”,即传递某个对象,但该对象是一个映射。我们将其称为 testContext 映射。
然后你应该为你的未来变量选择一个特殊的语法,例如“${变量}”或“{{变量}}”。
之后,创建一个变量解析器,它使用正则表达式提取变量名称(如果它与模式匹配,否则返回原始值),然后在 testContext 映射中搜索该变量(变量 == 映射键,变量值 = = 地图中键的值)。
然后在步骤定义方法中使用此变量解析器和 testContext 映射来解析方法参数。

@And("we get appId from console"){
public void weGetAppIdfromConsole() {
    JavaScriptExecutor executor=(JavascriptExecutor)driver;
    String appId = (String)executor.executeScript("return page_data.application_id");
    System.out.println(appId);

    testContext.put("appId", appId);
}

When we fill in following details:
|applicationId| text | ${appId} |

@When("we fill in following details:"){
public void weFillDetails(DataTable data) {
    List<String> row = table.asLists(String.class).get(0);
    String arg1 = VarParser.parse(row.get(0), testContext); // should return 'applicationId'
    String arg2 = VarParser.parse(row.get(1), testContext); // should return 'text'
    String arg3 = VarParser.parse(row.get(3), testContext); // should return the value of the 'appId' variable

    // other logic
}
© www.soinside.com 2019 - 2024. All rights reserved.