30

我在 Java 中使用 Selenium Webdriver。单击“下一步”按钮以从第 1 页移动到第 2 页后,我想获取当前 url。这是我的代码:

    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 页的 url)。

4

3 回答 3

30

就像你说的那样,因为下一个按钮的 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);
} 
于 2013-04-26T18:31:05.493 回答
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");
    }
于 2014-04-07T13:39:48.683 回答
0

自从我用 selenium 编码以来已经有一段时间了,但你的代码对我来说看起来不错。需要注意的一点是,如果没有找到元素,但是超时了,我认为代码会继续执行。所以你可以做这样的事情:

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

上面的布尔值返回什么?你确定 selenium 真的导航到预期的页面吗?(这听起来像是一个愚蠢的问题,但你真的在看页面变化吗……硒可以远程运行,你知道……)

于 2013-04-26T18:00:04.333 回答