无法再在 Chrome 中打开和关闭标签页
Cannot open and close tabs in Chrome anymore
问题:
几个月前,我们添加了一个多选项卡功能测试,使用 CTRL/COMMAND + t
打开选项卡并使用 CTRL/COMMAND + v
键盘快捷键关闭。
相关辅助函数:
this.getControlKey = function () {
var isWin = /^win/.test(process.platform);
return isWin ? protractor.Key.CONTROL : protractor.Key.COMMAND;
};
this.openAndSwitchToNewTab = function (url) {
element(by.tagName("body")).sendKeys(protractor.Key.chord(this.getControlKey(), "t"));
// failing, if new tab was not opened
browser.getAllWindowHandles().then(function (handles) {
expect(handles.length).toBeGreaterThan(1);
});
return browser.get(url);
};
最近,它开始失败并出现 Expected 1 to be greater than 1
错误,这意味着未打开新选项卡。而且,我已经确认这两个键盘快捷键都不再起作用了。
为什么它停止使用快捷方式打开和关闭标签页?
使用当前最新的 Protractor 2.1.0 和 ChromeDriver 2.15(也尝试使用最新的 2.16,但没有成功)。
想法和更多信息:
一开始以为是Chrome44相关的问题:
- Keys.ENTER, Keys.TAB, Keys.SPACE are not working on Chrome 44
- Input.dispatchKeyEvents handles some keys incorrectly
但是,使用 BrowserStack
我也在旧的 Chrome 版本上重现了这个问题。
它在 Firefox 中就像发条一样工作。
- 我实际上可以在
BrowserStack
的日志中看到发送到 body
元素的和弦,但在浏览器中没有任何反应。
- 我实际上可以让相同的代码在 Windows 上运行。 所以,它可能是 Mac OS 具体的。
我尝试更改密钥的发送方式。以下是我的一些尝试:
browser.actions().mouseMove(element(by.tagName("body"))).sendKeys(protractor.Key.chord(this.getControlKey(), "t")).perform();
browser.driver.switchTo().activeElement().sendKeys(protractor.Key.chord(this.getControlKey(), "t"));
也切换到 beta 频道并在 Chrome46 上重现了同样的问题。
作为解决方法,要打开一个选项卡,我可以在应用程序内的任何 link 上执行 CTRL/COMMAND + SHIFT + click
:
// open new tab by clicking a logo
var logo = element(by.css("a.logo"));
browser.actions().keyDown(this.getControlKey()).keyDown(protractor.Key.SHIFT).click(logo).keyUp(this.getControlKey()).keyUp(protractor.Key.SHIFT).perform();
// switch to a new tab
return browser.getAllWindowHandles().then(function (handles) {
return browser.switchTo().window(handles[handles.length - 1]).then(function () {
return browser.get(url);
})
});
这里的问题是我仍然无法关闭选项卡,因为 CTRL/COMMAND + w
不起作用。
它不仅是量角器特有的。这是一段 Python 代码,它打开 google.com,将 "testing" 放入搜索字段并将 COMMAND + A
发送到输入框。在 Firefox 中,它的行为符合预期 - 选择输入框中的文本,但在 Chrome 中不起作用(Python 2.7,selenium 2.47.1,Chrome 46,chromedriver 2.17) :
from selenium.webdriver import ActionChains
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://google.com')
q = driver.find_element_by_name("q")
q.send_keys("testing")
ActionChains(driver).send_keys_to_element(q, Keys.COMMAND + "a").perform()
我用 sauclabs 测试过 chromeVersion 38 到 44
它只在 44.v44.0.2403.125 上工作,准确地说是在 saucelabs 上[也在本地 [44.0.2403.130 m] 上测试过]
并且我使用了 ChromeDriver 2.17 和 SeleniumWebDriver 2.47.1
我已经在 Java
only.Hope 中尝试过了 Javascript
public static void doChromeTest(WebDriver driver) {
for (int i = 0; i < 10; i++) {
openTab(driver);
}
System.out.println("After Open Tab " + driver.getWindowHandles().size());
for (int i = 0; i < 10; i++) {
closeTab(driver);
}
System.out.println("After Close Tab " + driver.getWindowHandles().size());
driver.quit();
}
public static void openTab(WebDriver driver) {
//Both will work
//driver.findElement(By.tagName("body")).sendKeys(Keys.chord(Keys.CONTROL, "t"));
new Actions(driver).sendKeys(Keys.chord(Keys.CONTROL, "t")).build().perform();
}
public static void closeTab(WebDriver driver) {
//Both will work
//driver.findElement(By.tagName("body")).sendKeys(Keys.chord(Keys.CONTROL, "w"));
new Actions(driver).sendKeys(Keys.chord(Keys.CONTROL, "w")).build().perform();
}
我想我已经更接近于理解正在发生的事情了。
首先,它似乎是 OS-特定的。我自己在 BrowserStack 上的测试和 Madhan 在 Sauce Labs 上的测试证明了带 CONTROL 的键盘快捷键在 Windows.Windows 44 中有效。
引用相关related open chromedriver bug:
This bug is particularly noticeable on Mac, because a lot of special
key handling is done in render view host view mac, which is above
where we are simulating the event.
This leads to some things like ctrl+w doesn't close the window (on
windows), command+a does select all on mac, etc. This is unfortunate
but is able to be worked around for the most part.
问题:
几个月前,我们添加了一个多选项卡功能测试,使用 CTRL/COMMAND + t
打开选项卡并使用 CTRL/COMMAND + v
键盘快捷键关闭。
相关辅助函数:
this.getControlKey = function () {
var isWin = /^win/.test(process.platform);
return isWin ? protractor.Key.CONTROL : protractor.Key.COMMAND;
};
this.openAndSwitchToNewTab = function (url) {
element(by.tagName("body")).sendKeys(protractor.Key.chord(this.getControlKey(), "t"));
// failing, if new tab was not opened
browser.getAllWindowHandles().then(function (handles) {
expect(handles.length).toBeGreaterThan(1);
});
return browser.get(url);
};
最近,它开始失败并出现 Expected 1 to be greater than 1
错误,这意味着未打开新选项卡。而且,我已经确认这两个键盘快捷键都不再起作用了。
为什么它停止使用快捷方式打开和关闭标签页?
使用当前最新的 Protractor 2.1.0 和 ChromeDriver 2.15(也尝试使用最新的 2.16,但没有成功)。
想法和更多信息:
一开始以为是Chrome44相关的问题:
- Keys.ENTER, Keys.TAB, Keys.SPACE are not working on Chrome 44
- Input.dispatchKeyEvents handles some keys incorrectly
但是,使用
BrowserStack
我也在旧的 Chrome 版本上重现了这个问题。它在 Firefox 中就像发条一样工作。
- 我实际上可以在
BrowserStack
的日志中看到发送到body
元素的和弦,但在浏览器中没有任何反应。 - 我实际上可以让相同的代码在 Windows 上运行。 所以,它可能是 Mac OS 具体的。
我尝试更改密钥的发送方式。以下是我的一些尝试:
browser.actions().mouseMove(element(by.tagName("body"))).sendKeys(protractor.Key.chord(this.getControlKey(), "t")).perform(); browser.driver.switchTo().activeElement().sendKeys(protractor.Key.chord(this.getControlKey(), "t"));
也切换到 beta 频道并在 Chrome46 上重现了同样的问题。
作为解决方法,要打开一个选项卡,我可以在应用程序内的任何 link 上执行
CTRL/COMMAND + SHIFT + click
:// open new tab by clicking a logo var logo = element(by.css("a.logo")); browser.actions().keyDown(this.getControlKey()).keyDown(protractor.Key.SHIFT).click(logo).keyUp(this.getControlKey()).keyUp(protractor.Key.SHIFT).perform(); // switch to a new tab return browser.getAllWindowHandles().then(function (handles) { return browser.switchTo().window(handles[handles.length - 1]).then(function () { return browser.get(url); }) });
这里的问题是我仍然无法关闭选项卡,因为
CTRL/COMMAND + w
不起作用。它不仅是量角器特有的。这是一段 Python 代码,它打开 google.com,将 "testing" 放入搜索字段并将
COMMAND + A
发送到输入框。在 Firefox 中,它的行为符合预期 - 选择输入框中的文本,但在 Chrome 中不起作用(Python 2.7,selenium 2.47.1,Chrome 46,chromedriver 2.17) :from selenium.webdriver import ActionChains from selenium import webdriver from selenium.webdriver.common.keys import Keys driver = webdriver.Chrome() driver.maximize_window() driver.get('https://google.com') q = driver.find_element_by_name("q") q.send_keys("testing") ActionChains(driver).send_keys_to_element(q, Keys.COMMAND + "a").perform()
我用 sauclabs 测试过 chromeVersion 38 到 44
它只在 44.v44.0.2403.125 上工作,准确地说是在 saucelabs 上[也在本地 [44.0.2403.130 m] 上测试过]
并且我使用了 ChromeDriver 2.17 和 SeleniumWebDriver 2.47.1
我已经在 Java
only.Hope 中尝试过了 Javascript
public static void doChromeTest(WebDriver driver) {
for (int i = 0; i < 10; i++) {
openTab(driver);
}
System.out.println("After Open Tab " + driver.getWindowHandles().size());
for (int i = 0; i < 10; i++) {
closeTab(driver);
}
System.out.println("After Close Tab " + driver.getWindowHandles().size());
driver.quit();
}
public static void openTab(WebDriver driver) {
//Both will work
//driver.findElement(By.tagName("body")).sendKeys(Keys.chord(Keys.CONTROL, "t"));
new Actions(driver).sendKeys(Keys.chord(Keys.CONTROL, "t")).build().perform();
}
public static void closeTab(WebDriver driver) {
//Both will work
//driver.findElement(By.tagName("body")).sendKeys(Keys.chord(Keys.CONTROL, "w"));
new Actions(driver).sendKeys(Keys.chord(Keys.CONTROL, "w")).build().perform();
}
我想我已经更接近于理解正在发生的事情了。
首先,它似乎是 OS-特定的。我自己在 BrowserStack 上的测试和 Madhan 在 Sauce Labs 上的测试证明了带 CONTROL 的键盘快捷键在 Windows.Windows 44 中有效。
引用相关related open chromedriver bug:
This bug is particularly noticeable on Mac, because a lot of special key handling is done in render view host view mac, which is above where we are simulating the event.
This leads to some things like ctrl+w doesn't close the window (on windows), command+a does select all on mac, etc. This is unfortunate but is able to be worked around for the most part.