,我正在学习编程,我有问题。我想只打开一个浏览器并关闭它,但是...... 我的程序打开两个浏览器并关闭一个。
黄瓜钩:
public class Hooks {
@Before
public void Initalize() {
Chrome ChromeRun = new Chrome();
ChromeRun.StartChrome().get(Config.baseURL);
System.out.println("BEFORE SCENARIO");
}
@After
public void TearDown() {
Controller Close = new Controller();
Close.CloseDriver();
}
头等舱:
public class Chrome {
public WebDriver StartChrome() {
System.setProperty("webdriver.chrome.driver", Config.ChromePath);
ChromeDriver driver = new ChromeDriver();
driver.manage().window().maximize();
return driver;
}
第二课:
public class Controller {
Chrome Chrome = new Chrome();
public WebDriver driver = Chrome.StartChrome();
public void CloseDriver() {
try {
driver.quit();
} catch (Exception e) {
System.out.println(":: WebDriver stop error");
}
driver = null;
System.out.println(":: WebDriver stopped");
}
也许我这样做有错误的想法? 我尝试在课堂部分分享项目。
答案 0 :(得分:1)
问题#1:您忽略Java样式约定并声明名称以大写字母开头的方法和变量。这会导致问题:
这会让其他可能帮助你的人简单地走开。 Java专家不喜欢阅读其他人的“臭”代码。
它会导致各种概念错误。例如,
Close.CloseDriver();
看起来像是静态方法的调用。但事实并非如此。为什么这是个问题?好吧,如果你编写令人困惑的代码,你会混淆人们。其他人肯定,也可能是你自己。
您确实需要阅读/理解/遵循Java样式约定。特别是如果您希望其他人阅读您的代码。
问题#2:它看起来像你没有考虑过包装器对象的目的和生命周期;即Chrome
,Controller
和Hooks
。如果正确执行,抽象单元测试中的常用代码就可以了。但是如果你没有清晰的心理模型来描述你的抽象需要如何工作,你最好编写简单的重复代码。
现在到了实际问题。由于上面的两个问题,我不确定我是否正确地阅读了您的代码,但它在我看来问题就在这里:
@After
public void TearDown() {
Controller Close = new Controller();
Close.CloseDriver();
}
好的,您正在关闭ChromeDriver
。但是哪一个?
答案:您正在关闭在上一个语句中实例化时创建的驱动程序。这是与ChromeDriver
方法设置的实例不同的Initialize
实例。
解决方案:我的建议是抛弃该代码并重新开始:
决定每个课程的用途,每个方法应该做什么,以及如何使用它们。我强烈怀疑你实际上只需要一堂课。
坚持严格标准Java标识符约定。