it-swarm.com.de

Selen erhält nach dem Laden einer Seite die aktuelle URL

Ich verwende Selenium Webdriver in Java. Ich möchte die aktuelle URL erhalten, nachdem ich auf die Schaltfläche "Weiter" geklickt habe, um von Seite 1 zu Seite 2 zu wechseln. Hier ist der Code, den ich habe:

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

Ich habe sowohl implizite als auch explizite Warteaufrufe, um zu warten, bis die Seite vollständig geladen ist, bevor ich die aktuelle URL erhalte. Es wird jedoch immer noch die URL für Seite 1 ausgedruckt (es wird erwartet, dass dies die URL für Seite 2 ist).

25
pew007

Wie Sie sagten, da der xpath für die nächste Schaltfläche auf jeder Seite derselbe ist, funktioniert er nicht. Es funktioniert so wie es codiert ist, dass es auf die Anzeige des Elements wartet, aber da es bereits angezeigt wird, gilt das implizite Warten nicht, da es überhaupt nicht warten muss. Warum nutzen Sie nicht die Tatsache, dass sich die URL ändert, da sie sich scheinbar ändert, wenn auf die nächste Schaltfläche geklickt wird. Ich mache C #, aber ich denke in Java es wäre so etwas wie:

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

Seite 2 befindet sich in einem neuen Tab/Fenster? Verwenden Sie in diesem Fall den folgenden Code:

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

Es ist schon eine Weile her, dass ich mit Selen codiert habe, aber dein Code sieht für mich in Ordnung aus. Zu beachten ist, dass, wenn das Element nicht gefunden wird, das Timeout jedoch überschritten wird, der Code meiner Meinung nach weiterhin ausgeführt wird. Sie können also so etwas tun:

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

Was gibt der obige Boolesche Wert zurück? Und sind Sie sicher, dass Selen tatsächlich zur erwarteten Seite navigiert? (Das mag sich nach einer dummen Frage anhören, aber sehen Sie tatsächlich zu, wie sich die Seiten ändern? Selen kann aus der Ferne ausgeführt werden, wie Sie wissen ...)

0
KyleM