我需要检查一个页面对象集合,看看每个页面对象是否在其WebDriver上调用了quit()。
我编写了以下方法来检查WebDriver的状态:
public static boolean hasQuit(WebDriver driver) {
try {
driver.getTitle();
return false;
} catch (SessionNotFoundException e) {
return true;
}
}
问题在于:我不喜欢抛出并捕获异常以发现布尔值的真相,但似乎我没有选择,因为 WebDriver API 没有提供一种方法来检查司机是否已退出。
所以我的问题是, 是否有更好的方法来检查WebDriver是否已退出?
我发现了一个类似的(也是更一般的)问题 here ,但问题没有任何已尝试的代码,唯一的答案是始终将WebDriver设置为退出后为null(我不一定能控制)。
答案 0 :(得分:17)
如果调用了quit()
,driver.toString()
将返回null:
>>> FirefoxDriver: firefox on XP (null))
否则,它返回对象的哈希码:
>>> FirefoxDriver: firefox on XP (9f897f52-3a13-40d4-800b-7dec26a0c84d)
所以你可以在分配布尔值时检查null:
boolean hasQuit = driver.toString().contains("(null)");
答案 1 :(得分:12)
这是最常见的情况。大多数在实际工作环境中使用Selenium的开发人员想要一种方便的方式来判断WebDriver是否已经退出,他们正在已经建立的测试框架中工作,并尝试重构框架以确保只使用WebDrivers的自定义扩展可能比它的价值更麻烦。
在这种情况下,Sajan的回答和Gili对他的回答的建议将没有用,因为覆盖RemoteWebDriver#stopClient()
不是一种选择。 (此外,即使是这样,大多数人都在寻找一个简单的答案。)
只要您使用Selenium附带的WebDriver标准实现(FirefoxDriver,ChromeDriver,InternetExplorerDriver,SafariDriver等),您就可以将WebDriver转换为RemoteWebDriver,然后检查sessionId是否为null(Pat是在正确的轨道上,但直接调用sessionId比使用toString()
)更好。
public static boolean hasQuit(WebDriver driver) {
return ((RemoteWebDriver)driver).getSessionId() == null;
}
对于所有情况的95%,这个答案应该是好的,因为你多久会使用一个没有实现RemoteWebDriver的WebDriver? (不常见。)
这种情况不太常见,,但也许您要么:
(a)使用精心设计和抽象的框架,或
(b)从头开始制备硒测试框架。
在这种情况下,您可以创建自己的扩展WebDriver的界面:
public interface CustomDriver extends WebDriver {
boolean hasQuit();
}
然后您可以像这样扩展标准WebDrivers(在此示例中为ChromeDriver):
public class CustomChromeDriver extends ChromeDriver implements CustomDriver {
boolean hasQuit = false;
@Override
public boolean hasQuit() {
return hasQuit;
}
@Override
public void stopClient() {
super.stopClient();
hasQuit = true;
}
}
答案 2 :(得分:5)
quit
(StopClient)后将调用 RemoteWebDriver Source方法,您可以将RemoteWebDriver
的实例子类化并覆盖stopClient
方法,设置一些标志并检查标志以确定webdriver是否已关闭(quit
)。