我想使用Java与WebDriver(Selenium 2)一起使用JavaScript。
我跟随了一些指南和Getting Started page:在第一行有一条指令运行:
$ ./go webdriverjs
我的问题:从哪个文件夹/位置运行/执行上面提到的命令?
根据您之前的问题,我想您想要从Java的WebDriver
运行JavaScript代码段。如果我错了,请纠正我。
WebDriverJs
实际上是“只是”另一种WebDriver
语言绑定(你可以用Java,C#,Ruby,Python,JS编写你的测试,到目前为止可能还有更多的语言)。特别是这一个是JavaScript,因此允许您用JavaScript编写测试。
如果要在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');");
你可以在这个here, in the documenation上找到更多的文档,或者最好是in the JavaDocs of JavascriptExecutor
。
executeScript()
也接受函数调用和原始JS。你可以return
一个值,你可以传递许多复杂的参数,一些随机的例子:
// returns the right WebElement
// it's the same as driver.findElement(By.id("someId"))
js.executeScript("return document.getElementById('someId');");
// draws a border around WebElement
WebElement element = driver.findElement(By.anything("tada"));
js.executeScript("arguments[0].style.border='3px solid red'", element);
// 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是最受欢迎的自动化测试套件之一。 Selenium旨在支持和鼓励基于Web的应用程序和各种浏览器和平台的功能方面的自动化测试。
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应用程序进行点击。但首先尝试明显的解决方案。
我没有看到如何向方法调用添加参数,我花了一段时间才找到它,所以我在这里添加它。如何传递参数(到javascript函数),使用“arguments [0]”作为参数位置,然后在executeScript函数中将参数设置为输入参数。
driver.executeScript("function(arguments[0]);","parameter to send in");
如果您想使用javascript executor读取任何元素的文本,您可以执行以下代码:
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>
我遇到了类似的情况并解决了这个问题:
WebElement webElement = driver.findElement(By.xpath(""));
webElement.sendKeys(Keys.TAB);
webElement.sendKeys(Keys.ENTER);
您需要在Selenium SVN存储库检出的顶级目录中运行此命令。