无法再打开和关闭Chrome中的标签

时间:2015-07-31 16:48:13

标签: javascript google-chrome selenium selenium-webdriver protractor

问题:

几个月前,我们为多标签功能添加了一项测试,打开标签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. 起初,我认为这是与Chrome 44相关的问题:

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

  2. 它可以像Firefox一样在Firefox中运行。

  3. 我实际上可以在body的日志中看到发送到BrowserStack元素的和弦,但浏览器中没有任何内容。
  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. 同样切换到测试频道并在Chrome 46上重现了同样的问题。

  7. 作为解决方法,要打开标签页,我可以在应用程序内的任何链接上执行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,放置"测试"进入搜索字段并将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()
    

2 个答案:

答案 0 :(得分:3)

我用chromeVersion 38到44测试了sauclabs

它仅适用于44.v44.0.2403.125,准确地说是酱油[在当地测试[44.0.2403.130米]]

我使用了ChromeDriver 2.17和SeleniumWebDriver 2.47.1

我只在Java尝试过。希望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();
}

答案 1 :(得分:0)

我想我已经更接近了解发生了什么。

首先,它似乎是特定于操作系统的。我自己对BrowserStack和Madhan在Sauce Labs上的测试进行的测试证明了在Windows上的Chrome 44中使用CONTROL的键盘快捷键。

以下是相关related open chromedriver bug

的引用
  

这个错误在Mac 上特别明显,因为很多特别的   键处理在渲染视图主机视图mac中完成,如上所示   我们在哪里模拟事件。

     

这会导致像ctrl + w这样的东西没有关闭窗口(打开   Windows),命令+ a确实选择所有在mac等等。这是不幸的   但是大部分时间都可以解决。