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

Posted

技术标签:

【中文标题】如何使用 JavaScript 单击 Selenium WebDriver 中的元素?【英文标题】:How to click an element in Selenium WebDriver using JavaScript? 【发布时间】:2012-08-10 11:32:31 【问题描述】:

我有以下 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();

我想使用javascript 和 WebDriver 来单击按钮。我该怎么做?

【问题讨论】:

我不明白 - 你想让 .click() 触发绑定到该按钮的 javascript 函数吗?或者你需要code.google.com/p/selenium/wiki/…之类的东西吗? 【参考方案1】:

通过 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);

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

【讨论】:

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

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

WebDriver driver = new FirefoxDriver();
JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("document.getElementById('gbqfb').click();");

【讨论】:

有 6 人投票赞成这个答案,但它对我不起作用。得到This is not a function... 异常。即使不能在控制台执行脚本,click()后面也不应该有分号。 这对我有用。我得到的例外是因为 HTML 页面没有完全加载,我在Thread.Sleep(); 上投入了更多时间,然后它为我工作。谢谢 当我们有“id”作为定位器时它会起作用。如果我有 xpath 作为定位器怎么办? @Almett 不要使用Thread.sleep()。相反,您应该使用WebDriverWait 或在您的网络驱动程序上设置页面加载时间。这个想法是,如果页面在不到一秒的时间内加载,您不必等待(例如)10 秒让您的Thread.sleep() 允许您的线程恢复, 是的,使用 WebDriverWait 代替 Thread.sleep() 是标准的【参考方案3】:

我知道这不是 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();

【讨论】:

【参考方案4】:

不确定 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();

【讨论】:

【参考方案5】:

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

WebDriver driver; // Assigned elsewhere
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("window.document.getElementById('gbqfb').click()");

【讨论】:

是否可以在不实例化的情况下使用 WebDriver?驱动对象必须初始化为 driver = new FirefoxDriver();只有声明是不够的。 确实是的:我选择不添加实例化(因此是注释),因为您可能想从不同的浏览器实例化驱动程序。【参考方案6】:

通过 XPath:检查目标页面上的元素,复制 Xpath 并使用以下脚本:为我工作。

WebElement nameInputField = driver.findElement(By.xpath("html/body/div[6]/div[1]/div[3]/div/div/div[1]/div[3]/ul/li[4]/a"));
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", nameInputField);

【讨论】:

最好使用相对 XPath 而不是绝对 XPath。【参考方案7】:
const Builder, By, Key, util = require('selenium-webdriver')

// FUNÇÃO PARA PAUSA
function sleep(ms) 
    return new Promise(resolve => setTimeout(resolve, ms));


async function example() 

    // chrome
    let driver = await new Builder().forBrowser("firefox").build()
    await driver.get('https://www.google.com.br')
    // await driver.findElement(By.name('q')).sendKeys('Selenium' ,Key.RETURN)

    await sleep(2000)

    await driver.findElement(By.name('q')).sendKeys('Selenium')

    await sleep(2000)

    // CLICAR
    driver.findElement(By.name('btnK')).click()



example()

Com essas últimas linhas, você pode clicar !

【讨论】:

【参考方案8】:

这段代码会在100毫秒后对WebElement“我们”执行点击操作:

WebDriver driver = new FirefoxDriver();
JavascriptExecutor jse = (JavascriptExecutor)driver;

jse.executeScript("var elem=arguments[0]; setTimeout(function() elem.click();, 100)", we);

【讨论】:

虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。 From review 这段代码将在 (100/1000) 秒后对 WebElement "we" 执行点击操作。 我想知道为什么有人会否决这个答案。 它可能因为需要更多信息而被否决。您可以编辑自己的帖子,而不是将请求的解释作为评论留下。【参考方案9】:

另一个最简单的解决方案是使用Key.RETUEN

点击here for solution in detail

driver.findElement(By.name("q")).sendKeys("Selenium Tutorial", Key.RETURN);

【讨论】:

【参考方案10】:

跨浏览器测试java脚本

public class MultipleBrowser 

    public WebDriver driver= null;
    String browser="mozilla";
    String url="https://www.omnicard.com";

    @BeforeMethod
    public void LaunchBrowser() 

        if(browser.equalsIgnoreCase("mozilla"))
            driver= new FirefoxDriver();
        else if(browser.equalsIgnoreCase("safari"))
            driver= new SafariDriver();
        else if(browser.equalsIgnoreCase("chrome"))
            //System.setProperty("webdriver.chrome.driver","/Users/mhossain/Desktop/chromedriver");
            driver= new ChromeDriver(); 
        driver.manage().timeouts().implicitlyWait(4, TimeUnit.SECONDS);
        driver.navigate().to(url);
    


但是当你想运行 firefox 时,你需要禁用 chrome 路径,否则浏览器会启动但应用程序可能不会启动。(尝试两种方式)。

【讨论】:

这没有回答问题,因为问题询问如何在 JavaScript 中而不是 Java 中进行。

以上是关于如何使用 JavaScript 单击 Selenium WebDriver 中的元素?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Appium 中使用 javascript 单击 Xamarin 元素?

如何使用 JavaScript 自动单击浏览器按钮?

如何通过使用 onClick() 函数单击按钮来填充 Javascript 中的表格?

如何使用javascript单击链接?

单击链接时如何使用 Javascript 更改部分 HTML?

如何在使用javascript单击div中的链接时禁用div中的所有其他链接[重复]