我在 Java 中使用 Selenium Webdriver。我想在单击“下一步”按钮从第 1 页移动到第 2 页后获取当前网址。这是我的代码:
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)。
就像你说的,因为下一个按钮的 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);
}
第 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");
}
自从我用硒编码以来已经有一段时间了,但是你的代码对我来说看起来不错。需要注意的一点是,如果没有找到元素,但是超时了,我认为代码会继续执行。所以你可以做这样的事情:
boolean exists = driver.findElements(By.xpath("//*[@id='someID']")).size() != 0
上面的布尔值返回什么?你确定 selenium 确实导航到了预期的页面吗? (这可能听起来像一个愚蠢的问题,但你真的在观察页面的变化吗……硒可以远程运行,你知道……)