TestNG运行Selenium脚本报driver cannot be resolved,@BeforeTest无报错原因咨询
问题根因
这个问题是典型的Java变量作用域问题,具体触发逻辑如下:
- 你在
@BeforeTest注解的OpenTheSuperAdmin()方法内部定义了WebDriver driver变量,该变量属于方法局部变量,作用域仅限于OpenTheSuperAdmin()方法内部,方法执行结束后变量就会被销毁,其他方法完全无法访问。 OpenTheSuperAdmin()方法运行时本身就在自己的作用域内访问driver,自然不会报错;而@Test注解的ClickOnBanner()方法和OpenTheSuperAdmin()是平级的类方法,没有权限访问其他方法内部的局部变量,所以就会抛出driver cannot be resolved的错误。
修复方案
只需要把driver定义为类的成员变量即可,修改后代码参考:
package bannerTstNG; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; public class BannerTestNG { // 将driver定义为类成员变量,整个类的所有方法都可以访问 WebDriver driver; @BeforeTest public void OpenTheSuperAdmin() throws InterruptedException { // Java字符串中的反斜杠需要转义,要写为\\ System.setProperty("webdriver.chrome.driver","D:\\myselenium\\bannerTstNG\\driver\\chromedriver\\chromedriver.exe"); // 直接给成员变量driver赋值,不要加WebDriver类型声明,否则会重新定义局部变量 driver = new ChromeDriver(); driver.get("https://ss-superadmin-staging.labaiik.net/"); driver.manage().window().maximize(); driver.findElement(By.xpath("//input[@id='email']")).sendKeys("arsalan.hameed@avrioc.com"); driver.findElement(By.xpath("//input[@id='password']")).sendKeys("admin"); Thread.sleep(1000); driver.findElement(By.xpath("//button[contains(text(),'Login')]")).click(); Thread.sleep(6000); } @Test public void ClickOnBanner() { // 补充了缺失的分号 driver.findElement(By.xpath("//body/div[2]/div[1]/div[1]/div[1]/div[3]/div[1]/ul[1]/li[4]/a[1]")).click(); } // 建议补充测试后资源释放逻辑 @AfterTest public void tearDown() { if(driver != null) { driver.quit(); } } }
另外还有两个隐藏的语法问题也已经在上述代码中修正:
- Windows本地路径的反斜杠在Java字符串中需要转义,要写成
\\,否则会触发字符串转义错误 - 原代码中
click()方法后缺失分号,直接运行也会报语法错误
内容的提问来源于stack exchange,提问作者iori
相关产品推荐
相关产品推荐

