J'utilise Selenium Webdriver en Java. Je veux obtenir l'url actuelle après avoir cliqué sur le bouton "Suivant" pour passer de la page 1 à la page 2. Voici le code que j'ai:
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);
}
J'ai à la fois les appels d'attente implicites et explicites pour attendre que la page soit complètement chargée avant d'obtenir l'url actuelle. Cependant, il imprime toujours l'URL de la page 1 (il devrait s'agir de l'URL de la page 2).
Comme vous l'avez dit, car le xpath du bouton suivant est le même sur chaque page, cela ne fonctionnera pas. Il fonctionne comme codé en ce qu'il attend que l'élément soit affiché, mais comme il est déjà affiché, l'attente implicite ne s'applique pas car il n'a pas besoin d'attendre du tout. Pourquoi n'utilisez-vous pas le fait que l'URL change depuis votre code, il semble changer lorsque vous cliquez sur le bouton suivant. Je fais C # mais je suppose qu'en Java ce serait quelque chose comme:
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);
}
La page 2 est dans un nouvel onglet/fenêtre? Si c'est le cas, utilisez le code ci-dessous:
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");
}
Cela fait un petit moment que je n'ai pas codé avec Selenium, mais votre code me semble correct. Une chose à noter est que si l'élément n'est pas trouvé, mais que le délai est dépassé, je pense que le code continuera à s'exécuter. Vous pouvez donc faire quelque chose comme ceci:
boolean exists = driver.findElements(By.xpath("//*[@id='someID']")).size() != 0
Qu'est-ce que le retour booléen ci-dessus? Et êtes-vous sûr que Selenium navigue réellement vers la page attendue? (Cela peut sembler une question stupide, mais regardez-vous réellement les pages changer ... Le sélénium peut être exécuté à distance, vous savez ...)