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. Тем не менее, это все-таки распечатать адрес Страница 1 (это URL-адрес страницы 2).

3 ответов


Как вы сказали, так как xpath для следующей кнопки одинакова на каждой странице, она не будет работать. Он работает как закодированный в том, что он ждет отображения элемента, но поскольку он уже отображается, неявное ожидание не применяется, потому что ему не нужно ждать вообще. Почему бы вам не использовать тот факт, что url-адрес изменяется, так как из вашего кода он изменяется при нажатии следующей кнопки. Я делаю C#, но я думаю, что в 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 в новой вкладке/окне ? Если это так, используйте код ниже:

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");
    }

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

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

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