【问题标题】:How to click an element in Selenium WebDriver using JavaScript?如何使用 JavaScript 单击 Selenium WebDriver 中的元素?
【发布时间】: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 来单击按钮。我该怎么做?

【问题讨论】:

标签: java javascript button click selenium-webdriver


【解决方案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 中进行。
          猜你喜欢
          • 1970-01-01
          • 2016-01-07
          • 1970-01-01
          • 2021-09-29
          • 2013-07-01
          • 2020-12-22
          • 2016-01-29
          • 1970-01-01
          相关资源
          最近更新 更多