当我搜索这样的元素时:
driver.findElement(By.id("myId")).isDisplayed();
如果找到元素,我想运行一些代码(使用找到的 WebElement 我会将它滚动到视口的中间)。我想对 findElement() 的所有调用都这样做,而不必每次调用它时手动复制代码。
有没有办法做到这一点?
当我搜索这样的元素时:
driver.findElement(By.id("myId")).isDisplayed();
如果找到元素,我想运行一些代码(使用找到的 WebElement 我会将它滚动到视口的中间)。我想对 findElement() 的所有调用都这样做,而不必每次调用它时手动复制代码。
有没有办法做到这一点?
您可以通过实施WebDriverEventListener
. 这是一个例子,
public class WebDriverListener implements WebDriverEventListener {
private WebDriver webDriver;
public WebDriverListener(WebDriver webDriver) {
this.webDriver = webDriver;
}
public void afterFindBy(By findBy, WebElement element, WebDriver driver) {
System.out.println("Found element now what??");
//do whatever needs to be done after you find the element
}
....
}
这是如何使用
@Test
public void test() {
WebDriver driver = new FirefoxDriver();
EventFiringWebDriver efwd = new EventFiringWebDriver(driver);
WebDriverListener eventListener = new WebDriverListener(driver);
efwd.register(eventListener);
efwd.get("http://www.google.com");
WebElement element = efwd.findElement(By.name("q"));
efwd.quit();
}
我通过创建自己的自定义驱动程序来完成这项工作,但我宁愿有更好的方法来做到这一点。
public class CustomFirefoxDriver extends FirefoxDriver {
/* (non-Javadoc)
* @see org.openqa.selenium.remote.RemoteWebDriver#findElement(org.openqa.selenium.By)
*/
@Override
public WebElement findElement(final By by) {
WebElement element = super.findElement(by);
//Automatically Scroll to the Element
if (element != null) {
Actions builder = new Actions(this);
Actions action = builder.moveToElement(element, 0, 0);
action.perform();
}
return element;
}
}