无法再在 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,但没有成功)。


想法和更多信息:

  1. 一开始以为是Chrome44相关的问题:

    但是,使用 BrowserStack 我也在旧的 Chrome 版本上重现了这个问题。

  2. 它在 Firefox 中就像发条一样工作。

  3. 我实际上可以在 BrowserStack 的日志中看到发送到 body 元素的和弦,但在浏览器中没有任何反应。
  4. 我实际上可以让相同的代码在 Windows 上运行。 所以,它可能是 Mac OS 具体的。
  5. 我尝试更改密钥的发送方式。以下是我的一些尝试:

    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"));
    
  6. 也切换到 beta 频道并在 Chrome46 上重现了同样的问题。

  7. 作为解决方法,要打开一个选项卡,我可以在应用程序内的任何 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 不起作用。

  8. 它不仅是量角器特有的。这是一段 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.