chromedriver 无头警报
chromedriver headless alerts
我在使用 chromedriver 进行 selenium webdriver 测试时遇到了这个问题。尽管在使用 Chrome 浏览器时我可以 运行 测试成功,但我不能 运行 在无头模式下进行相同的测试。
我无法处理 Js 警报。其实截图的时候好像连提示都不会弹出
Alert screenshot
我尝试了几种解决方法:
1) driver.window_handles
--> 似乎没有其他 window
2) driver.execute_script("window.confirm = function(){return true;}")
--> 该脚本没有任何变化
3) element = WebDriverWait(driver, 20).until(EC.alert_is_present())
当然还有明确的等待
在浏览器模式下我使用普通的:
try:
print driver.switch_to.alert.text
driver.switch_to.alert.accept()
except NoAlertPresentException as e:
print("no alert")
还有其他人在无头模式下遇到此警报问题吗?
- chromedriver v.2.30.477691
- Chrome 版本 59.0.3071.115
运行 headless chrome 时,我似乎遇到了同样的问题。
根据屏幕截图,警报 window 不会弹出。它在 chrome 上运行良好,但在无头 chrome 上运行良好。
我 运行 在 chrome 60.0.3112.72
和 chrome 驱动程序 2.30
因为无头 chrome 会自动丢弃警报。
检查这个:
https://bugs.chromium.org/p/chromium/issues/detail?id=718235
顺便说一句,你怎么能在chrome59 无头模式下截屏? chrome 59 有一个错误,在无头模式下每个屏幕截图都是 1x1 像素的图像,所以我升级到 chrome 60。
由于 Chrome headless 不(当前)支持警报,您必须对 alert()
和 confirm()
方法进行猴子修补。这是我使用的方法(在 C# 中):
/// <summary>
/// The Chrome Headless driver doesn't support alerts, so we need to override the window.alert method to get the expected behavior.
/// </summary>
/// <param name="driver">The active IWebDriver instance</param>
/// <param name="result">The result that the alert should return, i.e., true if we want it "accepted", false if we don't</param>
public static void SetupAlert(this IWebDriver driver, bool result)
{
// ks 7/27/17 - The Chrome Headless driver doesn't support alerts, so override the various window.alert methods to just set
const string scriptTemplate = @"
window.alertHandlerCalled = false;
window.alertMessage = null;
window.alert = window.confirm = function(str) {
window.alertHandlerCalled = true;
window.alertMessage = str;
return {{result}};
};";
var script = scriptTemplate.Replace("{{result}}", result.ToString().ToLower());
var js = (IJavaScriptExecutor)driver;
js.ExecuteScript(script);
}
/// <summary>
/// This is an optional accompaniment to the <see cref="SetupAlert"/> method, which checks to see
/// if the alert was, in fact, called. If you don't want to bother to check, don't worry about calling it.
/// Note that this doesn't reset anything, so you need to call <see cref="SetupAlert"/> each time before calling
/// this method.
/// </summary>
public static void WaitForAlert(this IWebDriver driver, TimeSpan? timeout = null)
{
const string script = @"return window.alertHandlerCalled";
var js = (IJavaScriptExecutor)driver;
var timeToBail = DateTime.Now.Add(timeout ?? TimeSpan.FromMilliseconds(500));
while (DateTime.Now < timeToBail)
{
var result = (bool)js.ExecuteScript(script);
if (result) return;
Thread.Sleep(100);
}
throw new InvalidOperationException("The alert was not called.");
}
我是这样使用的:
Driver.SetupAlert(true);
this.ClickElement(ResetButton);
Driver.WaitForAlert();
从 Chrome 61 开始仍然有这个问题,所以我花了一段时间寻找不同的解决方案。我最喜欢的是在显示警报之前注入 javascript 以自动接受警报,因为它很简单。
只需将以下代码行 放在导致显示警报的行 之前:
driver.ExecuteJavaScript("window.confirm = function(){return true;}");
适用于无头 chrome 和 PhantomJS。
只是想添加这个以防有人在使用 NightwatchJS 时遇到这个问题。
上面接受的解决方案对我有用,但使用 JS 需要对
稍作修改
driver.ExecuteJavaScript("window.confirm = function(){return true;}");
我需要将其更改为
// this.api.perform() in my case is the same as browser.perform()
this.api.perform(function () { this.confirm = function () { return true; }})
我在使用 chromedriver 进行 selenium webdriver 测试时遇到了这个问题。尽管在使用 Chrome 浏览器时我可以 运行 测试成功,但我不能 运行 在无头模式下进行相同的测试。
我无法处理 Js 警报。其实截图的时候好像连提示都不会弹出
Alert screenshot
我尝试了几种解决方法:
1) driver.window_handles
--> 似乎没有其他 window
2) driver.execute_script("window.confirm = function(){return true;}")
--> 该脚本没有任何变化
3) element = WebDriverWait(driver, 20).until(EC.alert_is_present())
当然还有明确的等待
在浏览器模式下我使用普通的:
try:
print driver.switch_to.alert.text
driver.switch_to.alert.accept()
except NoAlertPresentException as e:
print("no alert")
还有其他人在无头模式下遇到此警报问题吗?
- chromedriver v.2.30.477691
- Chrome 版本 59.0.3071.115
运行 headless chrome 时,我似乎遇到了同样的问题。 根据屏幕截图,警报 window 不会弹出。它在 chrome 上运行良好,但在无头 chrome 上运行良好。
我 运行 在 chrome 60.0.3112.72 和 chrome 驱动程序 2.30
因为无头 chrome 会自动丢弃警报。 检查这个: https://bugs.chromium.org/p/chromium/issues/detail?id=718235
顺便说一句,你怎么能在chrome59 无头模式下截屏? chrome 59 有一个错误,在无头模式下每个屏幕截图都是 1x1 像素的图像,所以我升级到 chrome 60。
由于 Chrome headless 不(当前)支持警报,您必须对 alert()
和 confirm()
方法进行猴子修补。这是我使用的方法(在 C# 中):
/// <summary>
/// The Chrome Headless driver doesn't support alerts, so we need to override the window.alert method to get the expected behavior.
/// </summary>
/// <param name="driver">The active IWebDriver instance</param>
/// <param name="result">The result that the alert should return, i.e., true if we want it "accepted", false if we don't</param>
public static void SetupAlert(this IWebDriver driver, bool result)
{
// ks 7/27/17 - The Chrome Headless driver doesn't support alerts, so override the various window.alert methods to just set
const string scriptTemplate = @"
window.alertHandlerCalled = false;
window.alertMessage = null;
window.alert = window.confirm = function(str) {
window.alertHandlerCalled = true;
window.alertMessage = str;
return {{result}};
};";
var script = scriptTemplate.Replace("{{result}}", result.ToString().ToLower());
var js = (IJavaScriptExecutor)driver;
js.ExecuteScript(script);
}
/// <summary>
/// This is an optional accompaniment to the <see cref="SetupAlert"/> method, which checks to see
/// if the alert was, in fact, called. If you don't want to bother to check, don't worry about calling it.
/// Note that this doesn't reset anything, so you need to call <see cref="SetupAlert"/> each time before calling
/// this method.
/// </summary>
public static void WaitForAlert(this IWebDriver driver, TimeSpan? timeout = null)
{
const string script = @"return window.alertHandlerCalled";
var js = (IJavaScriptExecutor)driver;
var timeToBail = DateTime.Now.Add(timeout ?? TimeSpan.FromMilliseconds(500));
while (DateTime.Now < timeToBail)
{
var result = (bool)js.ExecuteScript(script);
if (result) return;
Thread.Sleep(100);
}
throw new InvalidOperationException("The alert was not called.");
}
我是这样使用的:
Driver.SetupAlert(true);
this.ClickElement(ResetButton);
Driver.WaitForAlert();
从 Chrome 61 开始仍然有这个问题,所以我花了一段时间寻找不同的解决方案。我最喜欢的是在显示警报之前注入 javascript 以自动接受警报,因为它很简单。
只需将以下代码行 放在导致显示警报的行 之前:
driver.ExecuteJavaScript("window.confirm = function(){return true;}");
适用于无头 chrome 和 PhantomJS。
只是想添加这个以防有人在使用 NightwatchJS 时遇到这个问题。
上面接受的解决方案对我有用,但使用 JS 需要对
稍作修改driver.ExecuteJavaScript("window.confirm = function(){return true;}");
我需要将其更改为
// this.api.perform() in my case is the same as browser.perform()
this.api.perform(function () { this.confirm = function () { return true; }})