2

我尝试使用 selenium Web 驱动程序来使用方法findElement获取 WebElement 。有效。但是当我尝试调用方法findElement和参数作为 By.name("") 以获取 WebElement 作为回报时,反射 api 出现了问题。在这里,以下几行可以提供有关问题的更多信息。

Javaw 抛出异常

java.lang.NoSuchMethodException: org.openqa.selenium.firefox.FirefoxDriver.findElement(org.openqa.selenium.By$ByName) at java.lang.Class.getMethod(未知来源)

尝试了一般方法(工作)

WebDriver driver = new FirefoxDriver();
Method[] methods = driver.getClass().getMethods();
for(Method method:methods){
    System.out.println(method.getName());
}
driver.manage().window().maximize();
driver.get("http://www.facebook.com/");
By by = By.name("email");
WebElement element = driver.findElement(by);

使用Java反射api实现(通过以下代码发生异常)

WebDriver driver = new FirefoxDriver();
Method[] methods = driver.getClass().getMethods();
for(Method method:methods){
    System.out.println(method.getName());
}
driver.manage().window().maximize();
driver.get("http://www.facebook.com/");
By by = By.name("email");
Class c = Class.forName(driver.getClass().getName());
Method getMethod = c.getMethod("findElement", new Class[]{by.getClass()});
getMethod.setAccessible(true);
WebElement element = (WebElement) getMethod.invoke(driver, by);


请有人可以指导使用反射api完成代码工作

4

1 回答 1

0

真的没有findElement(By$name)By.name是 abstract 的子类By)。因此,您必须调用:

Method getMethod = c.getMethod("findElement", new Class[] { by.getClass().getSuperclass() });

或者

Method getMethod = c.getMethod("findElement", new Class[] { By.class });

另外,您代码中方法的调用是错误的,您需要将其更改为

WebElement element = (WebElement)getMethod.invoke(driver, by);

因为第一个参数是应该运行该方法的对象。

于 2012-07-16T21:38:49.377 回答