【问题标题】:How to access a variable stored in another method in java in the same class如何在同一个类中访问存储在java中另一个方法中的变量
【发布时间】:2022-01-24 19:25:00
【问题描述】:

我需要在第二种方法中访问变量“value”。我尝试将其设为实例变量,但它只是返回为 null。

public class RateFellowUnsatisfactoryPage extends PageObject {

@FindBy(xpath = "actual xpath")
private WebElementFacade checkbox;

@FindBy(xpath = "actual xpath")
private WebElementFacade fellowRated;   

private String value;

public void selects_first_checkbox() {
    value = checkbox.getValue();
    System.out.println(value);
    checkbox.click();
}

public void verifyFellowDisplayed() {
    String fellow = fellowRated.getTextValue();
    System.out.println(fellow);
    assertThat(fellow.equalsIgnoreCase(value));
    System.out.println(value);
}
}

这里是调用这些方法的代码

public class RateFellowUnsatisfactorySteps extends ScenarioSteps {

private RateFellowUnsatisfactoryPage rateFellowUnsatisfactoryPage;

@Step
public void selectsFirstCheckbox(){
    rateFellowUnsatisfactoryPage.selects_first_checkbox();
}

@Step
public void verifyFellowDisplayed(){
    rateFellowUnsatisfactoryPage.verifyFellowDisplayed();
}
}

【问题讨论】:

  • 你在这里所做的看起来不错。在第一个函数中命中此行时会打印什么?: System.out.println(value); (当创建一个像这样的私有实例变量时,您可能需要创建 getvalue()/setvalue() 函数...这样您就可以从类外部访问它...)
  • @pcalkins 在第一种方法中,它会打印同伴的 ID 号。我需要将同一个 ID 号与在第二种方法中检索到的 ID 号进行比较。此时,String 值的值变为 null。
  • 也许你有这个类的两个实例......你需要包含调用方法的代码。
  • @pcalkins 刚刚做到了
  • 通过调用构造函数初始化...所以 rateFellowUnsatisfactoryPage = new RateFellowUnsatisfactoryPage();现在,您只有对一个类的引用,但实际上并没有该类的任何实例。 (?)

标签: java selenium automation


【解决方案1】:

你所做的看起来是正确的。您确定在您为此 RateFellowUnsatisfactoryPage 实例调用 verifyFellowDisplayed 时已经调用了 selects_first_checkbox?显然,如果还没有设置,它仍然是null。

假设它已经被调用,它是在同一个线程中调用的吗? Java 有时会优化掉对成员变量的引用。尝试将其声明为 volatile,只要您使用(我认为)Java 8 或更高版本,它就应该修复它。如果这不能解决问题,请尝试将其声明为 AtomicReference,您将有一个额外的步骤来访问它。对不起,但我忘了具体是什么。 AtomicReference 的重点是它不会优化对它的任何引用。

【讨论】:

  • 仅结合 get/set 的 AtomicReference 等效于 volatile 变量。检查实施。内部字段是 volatile,get 和 set 分别进行 volatile read 和 volatile write。
  • @pveentjer 这一直是 volatile 的意图,但直到(我认为)Java 8 才真正实现。在那之前,大多数 Java 编译器并没有真正实现它,这就是为什么老- 像我这样的计时器仍然对 AtomicReference 更满意。
  • Java 内存模型已完全更新为 Java 5 中的 JSR-133。AtomicReference 是在 Java 5 中添加的,AtomicReference 和 volatile 之间没有任何区别。顺便说一句,我也是一个老前辈。我从 Java 1.1 开始。 edit 好的,30 年的经验你打败了我(感觉很年轻)。
猜你喜欢
  • 2016-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-16
  • 1970-01-01
  • 1970-01-01
  • 2020-10-15
  • 1970-01-01
相关资源
最近更新 更多