如何使用 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 中的元素?的主要内容,如果未能解决你的问题,请参考以下文章