使用 JavascriptExecutor 发送密钥并点击网页元素

Posted

技术标签:

【中文标题】使用 JavascriptExecutor 发送密钥并点击网页元素【英文标题】:Using JavascriptExecutor to sendKeys plus click on web element 【发布时间】:2015-10-16 10:45:15 【问题描述】:

我正在尝试在新选项卡中打开一个链接,然后在 Firefox 浏览器中使用 Java 中的 selenium 切换到该选项卡。据我了解,为了做到这一点,我需要使用发送键组合。

为了在同一个窗口中打开链接,我一直在使用这样的东西:

WebElement we = driver.findElement(By.xpath("//*[@id='btn']"));

javascriptExecutor executor = (JavascriptExecutor) driver;
executor.executeScript("arguments[0].click();", we);

以上对我来说工作正常。

现在我也在尝试发送密钥,如下所示,但不起作用:

JavascriptExecutor executor = (JavascriptExecutor) driver;
executor.executeScript("keyDown(Keys.CONTROL)
                        .keyDown(Keys.SHIFT)
                        .click(arguments[0])
                        .keyUp(Keys.CONTROL)
                        .keyUp(Keys.SHIFT);", we);

有什么建议吗?我无法弄清楚将密钥发送到 JavascriptExecutor 的正确语法。我见过一些使用 Actions 的类似解决方案,但这对我也不起作用。

【问题讨论】:

当您使用操作执行 CTRL+SHIFT+单击时,发生了什么?谢谢。 @alecxe 实际上,如果我使用new Actions(driver).keyDown(Keys.CONTROL).keyDown(Keys.SHIFT).click(we).keyUp(Keys.C‌​ONTROL).keyUp(Keys.SHIFT).perform();,那么链接会在 current 选项卡中打开。我也不知道如何使它正常工作。 为什么要使用Actions或者JavascriptExecutor来执行sendKeys?普通 Selenium WebElement 不起作用? 【参考方案1】:

尝试下面的代码打开页面上的任何链接到新标签并切换到该标签。在那里执行操作并返回第一个选项卡以进一步执行。

WebDriver driver = new FirefoxDriver();
        driver.get("http://***.com/");
        WebElement e = driver.findElement(By.xpath(".//*[@id='nav-questions']"));       
        Actions action = new Actions(driver); 
        action.keyDown(Keys.CONTROL).build().perform(); //press control key
        e.click();
        Thread.sleep(10000); // wait till your page loads in new tab
        action.keyUp(Keys.CONTROL).build().perform(); //release control key
        driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "\t"); //move to new tab
        driver.navigate().refresh(); // refresh page
        driver.findElement(By.xpath(".//*[@id='hlogo']/a")).click(); //perform any action in new tab. I am just clicking logo
        driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "\t"); //switch to first tab
        driver.navigate().refresh(); 
        driver.findElement(By.xpath(".//*[@id='hlogo']/a")).click();// refresh first tab & continue with your further work.I am just clicking logo

【讨论】:

以上是关于使用 JavascriptExecutor 发送密钥并点击网页元素的主要内容,如果未能解决你的问题,请参考以下文章

Selenium JavascriptExecutor 详解

国密证书双向认证客户端发送哪个

使用JavascriptExecutor改变页面元素

JavascriptExecutor 如何在 selenium webdriver 中工作

ssh-免密登录批量发送脚本

通过 Selenium WebDriver 从 JavascriptExecutor 接口使用 executeScript 方法时,arguments[0] 和 arguments[1] 是啥意思?