Selenium получает текущий url после загрузки страницы

Я использую Selenium Webdriver в Java. Я хочу получить текущий URL-адрес после нажатия кнопки "Далее", чтобы перейти со страницы 1 на страницу 2. Здесь код, который у меня есть:

    WebDriver driver = new FirefoxDriver();
    String startURL = //a starting url;
    String currentURL = null;
    WebDriverWait wait = new WebDriverWait(driver, 10);

    foo(driver,startURL);

    /* go to next page */
    if(driver.findElement(By.xpath("//*[@id='someID']")).isDisplayed()){
        driver.findElement(By.xpath("//*[@id='someID']")).click();  
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
        wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@id='someID']")));
        currentURL = driver.getCurrentUrl();
        System.out.println(currentURL);
    }   

У меня есть как неявные, так и явные вызовы ожидания, чтобы дождаться, когда страница будет полностью загружена, прежде чем я получу текущий url. Тем не менее, он все еще печатает URL-адрес для страницы 1 (он должен быть URL-адресом для страницы 2).

Ответы

Ответ 1

Как вы сказали, поскольку xpath для следующей кнопки одинакова на каждой странице, она не будет работать. Он работает как закодированный в том, что он ожидает, пока элемент будет отображаться, но поскольку он уже отображается, неявное ожидание не применяется, потому что ему не нужно ждать вообще. Почему бы вам не использовать тот факт, что URL-адрес изменяется, поскольку с вашего кода он меняется, когда нажимается следующая кнопка. Я делаю С#, но я предполагаю, что в Java это будет что-то вроде:

WebDriver driver = new FirefoxDriver();
String startURL = //a starting url;
String currentURL = null;
WebDriverWait wait = new WebDriverWait(driver, 10);

foo(driver,startURL);

/* go to next page */
if(driver.findElement(By.xpath("//*[@id='someID']")).isDisplayed()){
    String previousURL = driver.getCurrentUrl();
    driver.findElement(By.xpath("//*[@id='someID']")).click();  
    driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

    ExpectedCondition e = new ExpectedCondition<Boolean>() {
          public Boolean apply(WebDriver d) {
            return (d.getCurrentUrl() != previousURL);
          }
        };

    wait.until(e);
    currentURL = driver.getCurrentUrl();
    System.out.println(currentURL);
} 

Ответ 2

Страница 2 находится в новой вкладке/окне? Если это так, используйте приведенный ниже код:

try {

    String winHandleBefore = driver.getWindowHandle();

    for(String winHandle : driver.getWindowHandles()){
        driver.switchTo().window(winHandle);
        String act = driver.getCurrentUrl();
    }
    }catch(Exception e){
   System.out.println("fail");
    }

Ответ 3

Прошло немного времени с тех пор, как я закодировал селен, но ваш код выглядит хорошо для меня. Следует отметить, что если элемент не найден, но время ожидания передается, я думаю, что код будет продолжать выполняться. Итак, вы можете сделать что-то вроде этого:

boolean exists = driver.findElements(By.xpath("//*[@id='someID']")).size() != 0

Что возвращает вышеперечисленное логическое значение? И вы уверены, что селен действительно перейдет к ожидаемой странице? (Это может звучать как глупый вопрос, но вы на самом деле наблюдаете, как страницы меняются... селен можно запускать удаленно, вы знаете...)