如何使用 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 元素?
如何通过使用 onClick() 函数单击按钮来填充 Javascript 中的表格?