使用Webdriverjs无法发送按键,特别是使用F11全屏浏览器。

5
使用以下代码块可以打开Chrome浏览器,但是无法使用F11全屏浏览器。我曾经使用C#和Selenium,在Chrome和不同的浏览器中使用此方法都能正常工作。它找到了元素“body”,但没有发送按键。我在这里做错了什么,需要使用其他库吗?
Webdriverjs的文档非常糟糕,示例非常少,我正在认真考虑放弃使用它,可能转向Python。
var webdriver = require('selenium-webdriver');
var driver = new webdriver.Builder().
    withCapabilities(webdriver.Capabilities.chrome()).
    build();
driver.get('https://www.google.co.uk/');

driver.wait(function () {
    return driver.getTitle().then(function (title) {
        return title === 'Google';
    });
}, 1000);


driver.findElement(webdriver.By.xpath('/html/body')).sendKeys("F11");

为什么我们要这样做?我们正在开发一个网站,根据屏幕尺寸 800x600 + 和是否有工具栏来改变展示内容。根据屏幕的使用方式,不同的项目将被显示。我可以使用最大化窗口来实现此功能。

driver.manage().window().maximize();

然而,这仍然保留了工具栏,并且不会像用户按下F11键一样运作。


1
已经有最大化窗口的功能了:https://github.com/SeleniumHQ/selenium/blob/master/javascript/webdriver/webdriver.js#L1254 - Arran
区别在于F11会隐藏网址栏和其他工具栏。 - Richard
@Richard 这有什么实际意义呢? - ddavison
在我们正在创建的网站中,为了操作目的,它必须是全屏的,因此地址栏是不需要的,最大化也不是我所需要的(但是我可以让它工作:D)。 - trevellyon
你好!那个问题你解决了吗?我也想让浏览器全屏显示,而不仅仅是最大化。祝好,Margo - Margo
@Margo 是的和不是。最终我转向使用Python,所有的问题都在一夜之间消失了,我在更短的时间内完成了更多的测试。self.sendKeysWithClick(self.browser.find_element_by_css_selector('.main.list.ng-scope'), Keys.F11) 使用ccs元素查找主体并按下F11。使用CSS中的名称使得测试变得更加容易,因为我可以通过这种方式找到它,然后对其进行操作。所以很抱歉,我没有在JavaScript中让它工作。 - trevellyon
6个回答

4

花了些时间才找到,但你应该能在webdriver.Key中找到所有的键。

driver.findElement(webdriver.By.xpath('/html/body')).sendKeys(webdriver.Key.F11);

希望这可以帮助到您!


请注意,该方法现在是“Key”(单数),而不是“Keys”(复数)。 - JoeyC

2

一位同事刚刚发现这个在C#中运行良好:

Original Answer翻译成"最初的回答"

Driver.Instance.Manage().Window.FullScreen(); 

嗨,这个问题是关于JavaScript而不是C#,但这将会很有用,谢谢。 - trevellyon

1
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains

ActionChains(driver).send_keys(Keys.F11).perform()

我使用类似的命令通过Firefox的NoScript插件切换JS

编辑:我刚测试了一下,它可以工作!


嗨,user2426679,这个问题是关于Javascript而不是Python的。而且这仍然无法使用chromedriver.exe。 - trevellyon
你尝试的确切代码是什么?在你最初的帖子中,你将F11发送给一个元素(而不是一个动作链)。 - sam-6174
在C#中使用ChromeDriver.exe,类似的代码如下:Actions act = new Actions(driver); act.SendKeys(Keys.F11); act.Build().Perform(); - Alexei - check Codidact

0
这个应该适用于你:
driver.findElement(webdriver.By.xpath('/html/body')).sendKeys(Keys.F11);

1
不行,这也不起作用...Keys未定义(sendKeys.F11也是如此),感谢您的输入。 - trevellyon
请尝试使用"webdriver.Key"而不是"webdriver.Keys"。 - JoeyC

0
您可以使用以下代码最大化窗口:
driver.manage().window().maximize();

这会再次将工具栏留在顶部,这不是我们想要的,因为我们正在创建一个需要屏幕的全部面积的内部网站,然后根据屏幕大小,我们将能够从网站上取消CSS项。 - trevellyon
全屏显示是浏览器特定的实现,因此除非Selenium支持每个浏览器的特定行为,否则我怀疑您将无法访问此功能。此外,我特别认为您不想能够将F11发送到DOM,否则可能会发生很多可怕的事情。 - user3179064
嗨JamesK,这是正确的,但使用“selenium-webdriver”时,你应该实现用户所做的操作,即用户按F11键,是的,Selenium在其他版本中支持它(我成功地在c#中使用driver.FindElement(By.TagName("body")).SendKeys(Keys.F11);实现了它)。我愿意接受任何其他想法来设置它,因为这对于测试目的是必需的。我试图保持所有语言相同,以便在测试代码和开发代码上工作时不必改变思维方式。 - trevellyon
我仍然不认为这会起作用,因为你正在向DOM元素发送键。但是我期望高级用户操作可以执行它,即driver.actions().sendKeys(webdriver.sendKeys.F11),但他们似乎没有(请注意我正在使用Chrome-尚未在其他浏览器上尝试)。我不知道为什么,抱歉。如果您只想在全屏模式下进行测试并且正在使用Chrome,则可以尝试向其发送启动kiosk模式的命令行参数,但我不确定是否适合您的需求。 - user3179064

0

对我来说,在启动时正确模拟F11的方法是:

ChromeOptions options = new ChromeOptions();
options.addArguments("--start-fullscreen");
WebDriver driver = new ChromeDriver(options);

或者如果更喜欢使用自助模式:

ChromeOptions options = new ChromeOptions();
options.addArguments("--kiosk");
WebDriver driver = new ChromeDriver(options);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接