我在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页的网址(应该是第2页的网址)。
就像您说的那样,因为下一个按钮的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); }