问题:
几个月前,我们为多标签功能添加了一项测试,打开标签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,没有运气)。
思考和更多信息:
起初,我认为这是与Chrome 44相关的问题:
但是,使用BrowserStack
我也在旧版Chrome上重现了这个问题。
它可以像Firefox一样在Firefox中运行。
body
的日志中看到发送到BrowserStack
元素的和弦,但浏览器中没有任何内容。我试图改变密钥的发送方式。以下是我的一些尝试:
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"));
同样切换到测试频道并在Chrome 46上重现了同样的问题。
作为解决方法,要打开标签页,我可以在应用程序内的任何链接上执行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,放置"测试"进入搜索字段并将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()
答案 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等等。这是不幸的 但是大部分时间都可以解决。