web-dev-qa-db-ja.com

セレンはページをロードした後に現在のURLを取得します

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であると予想されます)。

25
pew007

あなたが言ったように、次のボタンのxpathはすべてのページで同じなので、機能しません。要素が表示されるまで待機するという点でコード化された動作をしますが、すでに表示されているため、まったく待機する必要がないため、暗黙的な待機は適用されません。コードから次のボタンをクリックするとURLが変わるように見えるので、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);
} 
26
ragamufin

ページ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");
    }
2
kev85270

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

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

上記のブール値は何を返しますか?そして、Seleniumが実際に予想されるページにナビゲートしますか? (それはばかげた質問のように聞こえるかもしれませんが、実際にページの変更を見ていますか... Seleniumはリモートで実行できます...)

0
KyleM