admin管理员组

文章数量:1389826

I have created a void method which prints out the required responses from an url (using Java and Playwright) but I actually need to receive these values for making junit assertions and I am trying to convert the method into a String method, but I can't get the returned value.

I get the following error: Index 0 out of bounds for length 0. I was trying various methods, but I always get either an empty result or an '0 out of bounds for length 0', so it seems I don't really add any values to my array list.

The printing out shows that the values are correct though..

Could somebody please point out what is wrong here?

This is my code:

public String getResponseAgain()
{
    List<String> anotherArray =  new ArrayList<>();
    String[] extractedValue ={""};
    page.onResponse(response -> {
        if (response.url().contains("myUrlIsHere")) {
            String value = response.url().substring(response.url().lastIndexOf("someValue") + 2,
                    response.url().indexOf("anotherValue"));
            String[] splitText = value.split("bySomeValue");
            List<String> arrayOfStrings = new ArrayList<>(Arrays.asList(splitText));
            extractedValue[0] = String.join(" ", arrayOfStrings);
            anotherArray.addAll(List.of(extractedValue));
            for(String arr : anotherArray){
                System.out.println("Arr is " + arr);
          }
        }
    });

    return anotherArray.get(0);
}

I use the method in a test class:

public void responsesTest(){
    
    ////some code that accesses url and is ok////

    Assertions.assertEquals("expected value", page.getResponseAgain());

}

This is the original method that works and prints out the correct values:

public void getSomeResponse(){
    page.onResponse(response -> {
        if (response.url().contains("myUrlIsHere")) {
            String value = response.url().substring(response.url().lastIndexOf("someValue") + 2, response.url().indexOf("anotherValue"));
            String[] splitText = value.split("bySomeValue");

            List<String> arrayOfStrings = new ArrayList<>(Arrays.asList(splitText));
            String extractedValue = String.join(" ", arrayOfStrings);
            System.out.println(extractedValue);
        }
    });
}

I have created a void method which prints out the required responses from an url (using Java and Playwright) but I actually need to receive these values for making junit assertions and I am trying to convert the method into a String method, but I can't get the returned value.

I get the following error: Index 0 out of bounds for length 0. I was trying various methods, but I always get either an empty result or an '0 out of bounds for length 0', so it seems I don't really add any values to my array list.

The printing out shows that the values are correct though..

Could somebody please point out what is wrong here?

This is my code:

public String getResponseAgain()
{
    List<String> anotherArray =  new ArrayList<>();
    String[] extractedValue ={""};
    page.onResponse(response -> {
        if (response.url().contains("myUrlIsHere")) {
            String value = response.url().substring(response.url().lastIndexOf("someValue") + 2,
                    response.url().indexOf("anotherValue"));
            String[] splitText = value.split("bySomeValue");
            List<String> arrayOfStrings = new ArrayList<>(Arrays.asList(splitText));
            extractedValue[0] = String.join(" ", arrayOfStrings);
            anotherArray.addAll(List.of(extractedValue));
            for(String arr : anotherArray){
                System.out.println("Arr is " + arr);
          }
        }
    });

    return anotherArray.get(0);
}

I use the method in a test class:

public void responsesTest(){
    
    ////some code that accesses url and is ok////

    Assertions.assertEquals("expected value", page.getResponseAgain());

}

This is the original method that works and prints out the correct values:

public void getSomeResponse(){
    page.onResponse(response -> {
        if (response.url().contains("myUrlIsHere")) {
            String value = response.url().substring(response.url().lastIndexOf("someValue") + 2, response.url().indexOf("anotherValue"));
            String[] splitText = value.split("bySomeValue");

            List<String> arrayOfStrings = new ArrayList<>(Arrays.asList(splitText));
            String extractedValue = String.join(" ", arrayOfStrings);
            System.out.println(extractedValue);
        }
    });
}
Share Improve this question edited Mar 14 at 12:30 Mina asked Mar 14 at 12:00 MinaMina 851 silver badge10 bronze badges 3
  • can you create a main method and show with an example please? – Anish B. Commented Mar 14 at 12:14
  • 2 I'd assume that anotherArray.get(0); is invoked before the lambda passed to page.onResponse is invoked. – Mark Rotteveel Commented Mar 14 at 12:29
  • ok, this was also my thought that something is written in a wrong place, I just can't wrap my head around it – Mina Commented Mar 14 at 12:37
Add a comment  | 

1 Answer 1

Reset to default 2

You’re returning anotherArray.get(0) immediately, but your page.onResponse callback is asynchronous. By the time the method returns, anotherArray is still empty. You need to wait for the network response before returning the value (e.g. use page.waitForResponse(...) or some other synchronization) so anotherArray gets populated before you try to read from it.

public String getResponseAgain() {
    // Wait for the needed response instead of using an asynchronous listener
    Response neededResponse = page.waitForResponse(r -> r.url().contains("myUrlIsHere"));
    
    // Parse the URL to extract the value
    String value = neededResponse.url().substring(
        neededResponse.url().lastIndexOf("someValue") + 2,
        neededResponse.url().indexOf("anotherValue")
    );
    String[] splitText = value.split("bySomeValue");
    String extractedValue = String.join(" ", splitText);
    
    return extractedValue;
}

本文标签: