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

セレンでコーディングしてから少し時間が経ちましたが、あなたのコードは私には問題ないようです。注意すべきことの1つは、要素が見つからなくてもタイムアウトが経過した場合、コードは引き続き実行されると思います。したがって、次のようなことができます。

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

上記のブール値は何を返しますか? そして、セレンが実際に期待されるページに移動することを確信していますか? (ばかげた質問のように聞こえるかもしれませんが、実際にページが変更されるのを見ていますか...セレンはリモートで実行できます...)

于 2013-04-26T18:00:04.333 に答える