【问题标题】:How to use a variable in different classes without it changing如何在不同的类中使用变量而不改变它
【发布时间】:2018-12-13 18:11:52
【问题描述】:

我试图使用我在一个类中使用的变量,然后在不同的类中使用该变量。 所以这是我的代码,它基本上从 url 获取一个 id

public class GameId {

    public String game_id() {

        String currentURL = Drivers.getDriver().getCurrentUrl();
        String[] arrayURL = currentURL.split("/");
        int arrLength = arrayURL.length;
        final String gameID;
        gameID = arrayURL[arrLength - 1];
        System.out.println(gameID);
        return gameID;

    }
}

我试图在不同类的测试中使用它,但它没有给我相同的答案,我试图断言这个游戏 id 包含在不同页面的 url 中,但函数再次运行所以值改变。

public void guest_login_from_pick_screen(){

    GameId gameid = new GameId();
    WebDriverWait wait = new WebDriverWait(Drivers.getDriver(), 10);
    gameid.game_id();
    wait.until(ExpectedConditions.urlMatches("https://web-game-stage.sportdec.com/games/"+ gameid.game_id()+"/join/"));

}

我在测试中使用了这两个函数,但我希望在第二个实例中使用第一个实例 (gameid.game_id();) 的值 (fixscreen.guest_login_from_pick_screen();)。这是完整的代码

@Test
public void join_game_already_logged_in () throws Exception {

    Header header = new Header();
    Thread.sleep(3000);

    GameLobby gamelobby = new GameLobby();


    gamelobby.clickElementWithName("Test Game");

    gamelobby.select_game();


    LeaderBoard leaderboard = new LeaderBoard();
    GameId gameid = new GameId();
    gameid.game_id();
    leaderboard.numberOfUsers();
    leaderboard.joinGame();
    FixturesScreen fixscreen = new FixturesScreen();
    fixscreen.guest_login_from_pick_screen();
    fixscreen.four_picks_make();
    Thread.sleep(4000);
    fixscreen.picks_match_total();
    fixscreen.submit_picks();
    Login login = new Login();
    login.select_register_from_login();

    Register register = new Register();
    register.register_in_pick_screen();
    fixscreen.submit_picks();
    Thread.sleep(3000);
    PickReceipt pickReceipt = new PickReceipt();
    pickReceipt.your_in_the_game();

}

【问题讨论】:

    标签: java selenium user-interface automation automated-tests


    【解决方案1】:
    public class GameId {
    
        public static String gameId = "";
        public String game_id() {
    
            String currentURL = Drivers.getDriver().getCurrentUrl();
            String[] arrayURL = currentURL.split("/");
            int arrLength = arrayURL.length;
            final String gameID;
            gameID = arrayURL[arrLength - 1];
            System.out.println(gameID);
            gameId  = gameID;
            return gameID;
    
        }
    }
    

    立即创建 GameId 对象,然后像这样 GameId.gameId 下次使用

    【讨论】:

      【解决方案2】:

      您需要将您的 GameID 类更改为单例类,并且需要使用封装概念。因此,它将创建一个实例,您可以获得当前游戏 ID,如下所示

      您必须如下更改您的 GameID

      public class GameId {
          private String currentGameId;
          private static GameId gameID;
      
          public static GameId getInstance(){
              if(gameID==null){
                  gameID=new GameId();
              }
              return gameID;
          }
      
          public void setCurrentGameId(String id){
              currentGameId=id;
          }
      
          public String getCurrentGameId(){
              return currentGameId;
          }
      
          public void game_id() {
              String currentURL = Drivers.getDriver().getCurrentUrl();
              String[] arrayURL = currentURL.split("/");
              int arrLength = arrayURL.length;
              final String gameID;
              gameID = arrayURL[arrLength - 1];
              System.out.println(gameID);
              this.currentGameId=gameID;
      
          }
      }
      

      只需调用getCurrentGameId方法即可获取当前的CaseID。

      public void guest_login_from_pick_screen(){
      
          GameId gameid =GameId.getInstance();
          WebDriverWait wait = new WebDriverWait(Drivers.getDriver(), 10);
          //gameid.currentGameId();//It will give the current CaseID from the GameID class
          wait.until(ExpectedConditions.urlMatches("https://web-game-stage.sportdec.com/games/"+gameid.getCurrentGameId()+"/join/"));
      }
      

      在你的测试方法中,应该修改如下

      LeaderBoard leaderboard = new LeaderBoard();
      GameId gameid = GameId.getInstance(); //It will create a new instance
      gameid.game_id();//This method will be executed once and gameID will be updated in a variable called currentGameId.So, we can simply call the getCurrentGameId() method to get the current ID.
      

      【讨论】:

      • 啊,我有点明白了,但是当我添加这个时,我不断得到一个无法解析的方法“getInstance”
      • 私有 GameId 游戏ID;需要改成私有静态GameId gameID;在 GameId 类中
      • 我改了,但是getInstance还是红色的,说不能解析实例,看来还是要在后面测试的方法中替换值?
      • 我已经通过将 getInstance 方法更改为 static 并将 gameid 对象创建更改为 GameId gameid = GameId.getInstance() 来更新答案
      • 看起来不错,但 gameid.currentGameId 具有私有访问权限,因此在 guest_login_from_pick_screen 方法中不可用。我可以将其更改为公开吗??
      【解决方案3】:

      请将变量static如下:

      public static String url="www.example.com";
      

      然后它可以在任何你想要的地方使用。

      【讨论】:

      • 我明白,但是当方法在 fixscreen.guest_login_from_pick_screen() 中再次运行时;变量被替换,我试图使用我从 gameid.game_id() 获得的第一个变量;我基本上是在尝试存储第一个变量以供以后使用
      • 当方法再次运行时它会改变值,我们已经声明它是静态而不是最终你可以在其他类中轻松更改值 1.e url="abc.com";
      【解决方案4】:

      请使用以下代码:-

      public void guest_login_from_pick_screen(){
      
          GameId gameid = new GameId();
          WebDriverWait wait = new WebDriverWait(Drivers.getDriver(), 10);
          String var = gameid.game_id();
          wait.until(ExpectedConditions.urlMatches("https://web-game-stage.sportdec.com/games/"+ var +"/join/"));
      
      }
      

      【讨论】:

        猜你喜欢
        • 2017-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-07
        相关资源
        最近更新 更多