java - selenio obtener url actual después de cargar una página
selenium webdriver (3)
¿La página 2 está en una nueva pestaña / ventana? Si es esto, usa el siguiente código:
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");
}
Estoy usando Selenium Webdriver en Java. Quiero obtener la URL actual después de hacer clic en el botón "siguiente" para pasar de la página 1 a la página 2. Aquí está el código que tengo:
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);
}
Tengo las llamadas de espera implícitas y explícitas para esperar a que la página se cargue por completo antes de obtener la URL actual. Sin embargo, todavía está imprimiendo la url para la página 1 (se espera que sea la url para la página 2).
Como ha dicho, dado que la ruta x para el siguiente botón es la misma en todas las páginas, no funcionará. Funciona como está codificado, ya que espera a que se muestre el elemento, pero como ya se muestra, la espera implícita no se aplica porque no necesita esperar en absoluto. ¿Por qué no usa el hecho de que la URL cambia desde su código? Parece que cambia cuando se hace clic en el botón siguiente. Hago C # pero supongo que en Java sería algo como:
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);
}
Ha pasado un tiempo desde que codifiqué con selenio, pero su código me parece bien. Una cosa a tener en cuenta es que si no se encuentra el elemento, pero se pasa el tiempo de espera, creo que el código continuará ejecutándose. Así que puedes hacer algo como esto:
boolean exists = driver.findElements(By.xpath("//*[@id=''someID'']")).size() != 0
¿Qué devuelve el booleano anterior? ¿Y está seguro de que el selenio en realidad navega a la página esperada? (Eso puede parecer una pregunta tonta, pero en realidad estás viendo cómo cambian las páginas ... se puede ejecutar Selenium de forma remota, ¿sabes?)