Groovy+Selenium环境下调用findElement方法报错求助
嘿Jim,别担心基础问题,刚接触Maven下的Groovy/Selenium/Geb这套组合,踩点坑太正常了!我来帮你理清楚这个报错的原因和解决办法。
报错原因分析
你看到的groovy.lang.MissingMethodException: No signature of method: GebConfig.findElement()...这个错误,核心问题是你的driver变量并没有指向真正的Selenium WebDriver实例,反而指向了Geb的配置对象(GebConfig)——而这个对象根本没有findElement方法,自然就报错了。
两种解决方法
方法1:直接通过Geb的Browser获取WebDriver
在Geb的体系里,WebDriver实例是被Browser对象封装起来的,所以你可以直接用browser.driver来拿到原生的Selenium WebDriver,然后调用findElement:
When(~/^find the element named "(.*?)"$/) { String btnName -> WebElement myElement = browser.driver.findElement(By.name(btnName)); }
方法2:继承Geb的Cucumber基类,简化driver调用
如果你的项目是Geb+Cucumber的组合,推荐让你的步骤类继承geb.cucumber.GebCucumberTesting——这个基类已经帮你做好了Browser和WebDriver的上下文关联,里面的driver属性直接就是原生WebDriver实例,不用再写browser.driver:
package step_definitions import features.support.Requests import geb.cucumber.GebCucumberTesting import org.apache.commons.io.* import org.openqa.selenium.By import org.openqa.selenium.WebElement import cucumber.api.groovy.EN.* // 继承GebCucumberTesting,获取WebDriver上下文 class ElementSteps extends GebCucumberTesting { When(~/^find the element named "(.*?)"$/) { String btnName -> WebElement myElement = driver.findElement(By.name(btnName)); } }
额外小提示
虽然你想掌握原生Selenium的findElement用法,但还是要提一句:Geb的选择器(比如$('input', name: 'btnK'))是对Selenium API的封装,写起来更简洁,而且能更好地和Geb的其他特性(比如页面模式)配合。不过既然你想深入学习原生用法,上面的两种方法都能帮你解决当前的问题。
内容的提问来源于stack exchange,提问作者Jimbo123

