如何在Selenium WebDriver Java中使用JavaScript

我想使用JavaScript与WebDriver(Selenium 2)使用Java。

我已经遵循了一些指南和入门页面 :第一行有一条指令可以运行:

$ ./go webdriverjs 

我的问题:从哪个文件夹/位置上面提到的命令将被运行/执行?

基于你以前的问题,我想你想运行Java的WebDriver JavaScript片段。 如果我错了,请纠正我。

WebDriverJs实际上只是另一个WebDriver语言绑定(你可以用Java,C#,Ruby,Python,JS甚至更多的语言编写testing)。 这一个,特别是JavaScript,允许你用JavaScript编写testing。

如果您想在Java WebDriver运行JavaScript代码,请改为:

 WebDriver driver = new AnyDriverYouWant(); if (driver instanceof JavascriptExecutor) { ((JavascriptExecutor)driver).executeScript("yourScript();"); } else { throw new IllegalStateException("This driver does not support JavaScript!"); } 

我也喜欢这样做,

 WebDriver driver = new AnyDriverYouWant(); JavascriptExecutor js; if (driver instanceof JavascriptExecutor) { js = (JavascriptExecutor)driver; } // else throw... // later on... js.executeScript("return document.getElementById('someId');"); 

您可以在这里,在文档中find更多的文档,或者最好是在JavascriptExecutor的JavaDocs中 。

executeScript()接受函数调用和原始JS。 你可以从中return一个值,你可以将许多复杂的parameter passing给它,一些随机的例子:

  1.  // returns the right WebElement // it's the same as driver.findElement(By.id("someId")) js.executeScript("return document.getElementById('someId');"); 
  2.  // draws a border around WebElement WebElement element = driver.findElement(By.anything("tada")); js.executeScript("arguments[0].style.border='3px solid red'", element); 
  3.  // changes all input elements on the page to radio buttons js.executeScript( "var inputs = document.getElementsByTagName('input');" + "for(var i = 0; i < inputs.length; i++) { " + " inputs[i].type = 'radio';" + "}" ); 

使用Selenium WebDriver的JavaScript

selenium是最受欢迎的自动testing套件之一。 Selenium旨在支持和鼓励基于Web的应用程序和各种浏览器和平台的function方面的自动化testing。

  public static WebDriver driver; public static void main(String[] args) { driver = new FirefoxDriver(); // This opens a window String url = "----"; /*driver.findElement(By.id("username")).sendKeys("yashwanth.m"); driver.findElement(By.name("j_password")).sendKeys("yashwanth@123");*/ JavascriptExecutor jse = (JavascriptExecutor) driver; if (jse instanceof WebDriver) { //Launching the browser application jse.executeScript("window.location = \'"+url+"\'"); jse.executeScript("document.getElementById('username').value = \"yash\";"); // Tag having name then driver.findElement(By.xpath(".//input[@name='j_password']")).sendKeys("admin"); //Opend Site and click on some links. then you can apply go(-1)--> back forword(-1)--> front. //Refresheing the web-site. driver.navigate().refresh(); jse.executeScript("window.history.go(0)"); jse.executeScript("window.history.go(-2)"); jse.executeScript("window.history.forward(-2)"); String title = (String)jse.executeScript("return document.title"); System.out.println(" Title Of site : "+title); String domain = (String)jse.executeScript("return document.domain"); System.out.println("Web Site Domain-Name : "+domain); // To get all NodeList[1052] document.querySelectorAll('*'); or document.all jse.executeAsyncScript("document.getElementsByTagName('*')"); String error=(String) jse.executeScript("return window.jsErrors"); System.out.println("Windowerrors : "+error); System.out.println("To Find the input tag position from top"); ArrayList<?> al = (ArrayList<?>) jse.executeScript( "var source = [];"+ "var inputs = document.getElementsByTagName('input');"+ "for(var i = 0; i < inputs.length; i++) { " + " source[i] = inputs[i].offsetParent.offsetTop" + //" inputs[i].type = 'radio';" "}"+ "return source" );//inputs[i].offsetParent.offsetTop inputs[i].type System.out.println("next"); System.out.println("array : "+al); // (CTRL + a) to access keyboard keys. org.openqa.selenium.Keys Keys k = null; String selectAll = Keys.chord(Keys.CONTROL, "a"); WebElement body = driver.findElement(By.tagName("body")); body.sendKeys(selectAll); // Search for text in Site. Gets all ViewSource content and checks their. if (driver.getPageSource().contains("login")) { System.out.println("Text present in Web Site"); } Long clent_height = (Long) jse.executeScript("return document.body.clientHeight"); System.out.println("Client Body Height : "+clent_height); // using selenium we con only execute script but not JS-functions. } driver.quit(); // to close browser } 

执行用户函数,将JS写入文件并读取为String并执行它以便于使用。

 Scanner sc = new Scanner(new FileInputStream(new File("JsFile.txt"))); String js_TxtFile = ""; while (sc.hasNext()) { String[] s = sc.next().split("\r\n"); for (int i = 0; i < s.length; i++) { js_TxtFile += s[i]; js_TxtFile += " "; } } String title = (String) jse.executeScript(js_TxtFile); System.out.println("Title : "+title); 

document.title&document.getElementById()是浏览器中可用的属性/方法。

JsFile.txt

 var title = getTitle(); return title; function getTitle() { return document.title; } 

您也可以尝试使用JavaScript进行点击:

 WebElement button = driver.findElement(By.id("someid")); JavascriptExecutor jse = (JavascriptExecutor)driver; jse.executeScript("arguments[0].click();", button); 

也可以使用jQuery。 在最坏的情况下,对于顽固的页面,可能需要通过自定义EXE应用程序进行点击。 但首先尝试明显的解决scheme。

如果你想阅读使用JavaScript执行者的任何元素的文本,你可以做一些像下面的代码:

 WebElement ele = driver.findElement(By.xpath("//div[@class='infaCompositeViewTitle']")); String assets = (String) js.executeScript("return arguments[0].getElementsByTagName('span')[1].textContent;", ele); 

在这个例子中,我有下面的HTML片段,我正在阅读“156”。

 <div class="infaCompositeViewTitle"> <span>All Assets</span> <span>156</span> </div> 

您需要在Selenium SVN存储库结帐的顶层目录中运行此命令。