所以我有 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' 。
有几种方法可以实现所需的行为。
其中之一是使用“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
}