如何使用 JavaScript 单击 Selenium WebDriver 中的元素?

IT技术 java javascript button click selenium-webdriver
2021-02-07 02:37:14

我有以下 HTML:

<button name="btnG" class="gbqfb" aria-label="Google Search" id="gbqfb"><span class="gbqfi"></span></button>

我用于单击“Google 搜索”按钮的以下代码在 WebDriver 中使用 Java 运行良好。

driver.findElement(By.id("gbqfb")).click();

我想在WebDriver 中使用JavaScript单击按钮。我该怎么做?

6个回答

通过 JavaScript 执行点击有一些您应该注意的行为。例如,如果绑定到onclick元素事件的代码调用window.alert(),您可能会发现 Selenium 代码挂起,这取决于浏览器驱动程序的实现。也就是说,您可以使用JavascriptExecutor该类来执行此操作。然而,我的解决方案与其他人提出的不同,您仍然可以使用 WebDriver 方法来定位元素。

// Assume driver is a valid WebDriver instance that
// has been properly instantiated elsewhere.
WebElement element = driver.findElement(By.id("gbqfd"));
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", element);

您还应该注意,最好使用接口click()方法WebElement,但在实例化驱动程序之前禁用本机事件这将实现相同的目标(具有相同的潜在限制),但不会强迫您编写和维护自己的 JavaScript。

这对我有用。我遇到的异常是因为 HTML 页面没有完全加载,我花了更多的时间Thread.Sleep();然后它为工作。谢谢
2021-03-13 02:37:14
因为您将元素引用作为executeScript调用中的第 0 个参数传入
2021-03-24 02:37:14
谢谢你,整个上午都在寻找一个好的解决方案,这就像一个魅力。
2021-03-29 02:37:14
我正在尝试在 safari 浏览器中的 webElement 上执行单击操作,但无法完成此操作。代码能够跟踪元素,读取 webelement 的文本,但不执行单击。也没有例外或错误。我该怎么表演?上述解决方案也不起作用。
2021-03-31 02:37:14
我可以知道为什么arguments[0].click();吗?你怎么知道它是索引0?
2021-04-04 02:37:14

这是使用 JavaScript 单击 WebDriver 中的按钮的代码:

WebDriver driver = new FirefoxDriver();
JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("document.getElementById('gbqfb').click();");
这对我有用。我遇到的异常是因为 HTML 页面没有完全加载,我花了更多的时间Thread.Sleep();然后它为工作。谢谢
2021-03-13 02:37:14
@Almett 不要使用Thread.sleep(). 相反,您应该使用WebDriverWait或在您的网络驱动程序上设置页面加载时间。这个想法是,如果页面在不到一秒的时间内加载,您不必等待(例如)10 秒Thread.sleep()让您的线程恢复,
2021-03-13 02:37:14
当我们将“id”作为定位器时,它会起作用。如果我有 xpath 作为定位器怎么办?
2021-03-14 02:37:14
有 6 人投票赞成答案,但这对我不起作用This is not a function...得到 例外。即使不能在控制台上执行脚本,click().后也不应该有分号
2021-03-25 02:37:14
是的,使用 WebDriverWait 而不是 Thread.sleep() 是标准的
2021-03-28 02:37:14

我知道这不是 JavaScript,但您也可以实际使用鼠标单击来单击动态 Javascript 锚点:

public static void mouseClickByLocator( String cssLocator ) {
     String locator = cssLocator;
     WebElement el = driver.findElement( By.cssSelector( locator ) );
     Actions builder = new Actions(driver);
     builder.moveToElement( el ).click( el );
     builder.perform();
}

不确定 OP 的答案是否真的得到了回答。

var driver = new webdriver.Builder().usingServer('serverAddress').withCapabilities({'browserName': 'firefox'}).build();

driver.get('http://www.google.com');
driver.findElement(webdriver.By.id('gbqfb')).click();

您不能使用 WebDriver 在 JavaScript 中执行此操作,因为 WebDriver 是一个 Java 工具。但是,您可以使用 WebDriver 从 Java 执行 JavaScript,并且您可以调用一些单击特定按钮的 JavaScript 代码。

WebDriver driver; // Assigned elsewhere
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("window.document.getElementById('gbqfb').click()");
确实是:我选择不添加实例化(因此是评论),因为您可能想要从不同的浏览器实例化驱动程序。
2021-04-07 02:37:14
是否可以在没有实例化的情况下使用 WebDriver?驱动对象必须初始化为 driver = new FirefoxDriver(); 仅仅声明是不够的。
2021-04-08 02:37:14