Java Selenium:跨类获取void方法变量及解决driver为空问题
嘿,我来帮你搞定这两个Java和Selenium的问题,咱们一步步拆解:
解答你的Java & Selenium问题
问题1:为什么getDriver()返回null?怎么解决?
这事儿核心是线程时机问题:你的actionPerformed方法是事件触发的——只有当用户点击按钮、选择Firefox这类操作发生时,这个方法才会执行,给driver2赋值。但你的main方法里,调用完bs.BrowserSelection1()就立刻去拿driver,这时候用户可能还没碰界面呢,actionPerformed根本没执行过,driver2自然还是初始的null。
解决办法就是让主线程等一等,等用户完成浏览器选择操作后再继续。这里用CountDownLatch来实现线程同步就很合适,给你改好的代码示例:
首先更新Browserselection类:
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.concurrent.CountDownLatch; import javax.swing.JFrame; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; @SuppressWarnings("serial") class Browserselection extends JFrame implements ActionListener { private WebDriver driver2; private final CountDownLatch waitLatch; // 构造方法里传入同步用的Latch public Browserselection(CountDownLatch latch) { this.waitLatch = latch; // 这里放你初始化UI的代码(比如创建FireFox复选框、按钮等) } public void BrowserSelection1() { // 显示窗口等UI初始化逻辑 setVisible(true); } @Override public void actionPerformed(ActionEvent e) { WebDriver d1 = null; if (FireFox.isSelected()) { // 假设FireFox是你的复选框组件 dispose(); System.setProperty("webdriver.gecko.driver", "driverPath"); d1 = new FirefoxDriver(); this.setDriver(d1); waitLatch.countDown(); // 告诉主线程:用户选完了! } } public WebDriver setDriver(WebDriver driver) { this.driver2 = driver; return this.driver2; } public WebDriver getDriver() { return this.driver2; } }
然后修改MyMainClass:
import java.util.concurrent.CountDownLatch; import org.openqa.selenium.WebDriver; public class MyMainClass { public static void main(String[] args) throws InterruptedException { // 创建一个计数为1的Latch,等一次用户操作 CountDownLatch latch = new CountDownLatch(1); Browserselection bs = new Browserselection(latch); bs.BrowserSelection1(); latch.await(); // 主线程暂停,直到用户完成选择 WebDriver driver = bs.getDriver(); System.out.println(driver + " Hello from main"); } }
另外提个小建议:Java规范里类名首字母要大写,你的Browserselection建议改成BrowserSelection,构造方法也和类名保持一致,这样代码更易读~
问题2:能不能直接访问actionPerformed里的d1变量?
答案是不行。因为d1是actionPerformed方法里if块的局部变量,它的作用域只限于那个代码块内部,外部类(包括MyMainClass)根本看不到它。
不过你完全不需要直接访问d1呀——你已经把d1赋值给了类的成员变量driver2,还写了getDriver()方法来获取它。只要解决了第一个问题,让driver2被正确赋值,你通过bs.getDriver()拿到的对象,就是和d1一模一样的引用~
内容的提问来源于stack exchange,提问作者Anandkumar Mehta
相关产品推荐
相关产品推荐

