如何在 Selenium WebDriver Java 中使用 JavaScript
Posted
技术标签:
【中文标题】如何在 Selenium WebDriver Java 中使用 JavaScript【英文标题】:How to use JavaScript with Selenium WebDriver Java 【发布时间】:2012-07-10 23:02:30 【问题描述】:我想通过 Java 将 javascript 与 WebDriver (Selenium 2) 一起使用。
我遵循了一些指南,并在Getting Started page:第一行有一条指令运行为:
$ ./go webdriverjs
我的问题:上述命令将从哪个文件夹/位置运行/执行?
【问题讨论】:
您想用 JavaScript 编写测试,还是想在测试中使用 Javascript 命令(用 Java 编写)? 我想在我的测试中使用 Javascript 命令(用 Java 编写) 【参考方案1】:根据您之前的问题,我想您想从 Java 的 WebDriver
运行 JavaScript sn-ps。如果我错了,请纠正我。
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
一个值,你可以传递很多复杂的参数给它,一些随机的例子:
1.
// 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';" +
"" );
【讨论】:
@RiponAlWasim 如果该功能嵌入到您的页面,只需执行js.executeScript("showAlert()");
。如果不是,请执行js.executeScript("function showAlert() alert('success'); ; showAlert()");
非常感谢。 js.executeScript("function showAlert() alert('success'); ; showAlert()");运作良好。或者,我想在我的 Java 代码中单独编写该 JS 代码/函数,并希望将 JS 函数调用为 js.executeScript("showAlert()"); Java代码中分别写JS代码/函数的方式/语法是什么?
不错。再次感谢。它工作得很好,我得到了确切的解决方案
@CodeEnhusiastic 是的。或者几乎,以防你误解了一个小细节。第一个参数是脚本,任何附加参数(第二个、第三个等)都会传递给脚本(并且可以通过魔术arguments
变量访问)。
@Srk95 你好!对不起,这篇文章已经 9 年了,我已经 7 年多没有使用 WebDriver 或任何其他类似技术了。我简直不知道了。由于跨域策略,您可能根本无法做到这一点?我找到了注入 jQuery 的旧答案,也许这些年之后它仍然可以工作:sqa.stackexchange.com/questions/2921/…【参考方案2】:
JavaScript 与 Selenium WebDriver
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 写入文件并读取为字符串并执行它以方便使用。
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;
【讨论】:
【参考方案3】:您也可以尝试通过 JavaScript 点击:
WebElement button = driver.findElement(By.id("someid"));
JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("arguments[0].click();", button);
你也可以使用jquery。在最坏的情况下,对于顽固的页面,可能需要通过自定义 EXE 应用程序进行点击。但请先尝试显而易见的解决方案。
【讨论】:
这似乎暂停了driver.manage().timeouts().implicitlyWait
设置的时间长度。是这样吗?如果是这样,如何加快速度?【参考方案4】:
没看到方法调用怎么加参数,找了好久才找到,这里加一下。 如何将参数传入(给javascript函数),使用“arguments[0]”作为参数位置,然后将参数设置为executeScript函数中的输入参数。
driver.executeScript("function(arguments[0]);","parameter to send in");
【讨论】:
【参考方案5】:如果您想使用 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>
【讨论】:
【参考方案6】:以下代码对我有用:
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.springframework.beans.factory.annotation.Autowired;
public class SomeClass
@Autowired
private WebDriver driver;
public void LogInSuperAdmin()
((JavascriptExecutor) driver).executeScript("console.log('Test test');");
【讨论】:
【参考方案7】:我也遇到过类似的情况,这样解决的:
WebElement webElement = driver.findElement(By.xpath(""));
webElement.sendKeys(Keys.TAB);
webElement.sendKeys(Keys.ENTER);
【讨论】:
【参考方案8】:您需要在 Selenium SVN 存储库签出的***目录中运行此命令。
【讨论】:
以上是关于如何在 Selenium WebDriver Java 中使用 JavaScript的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Java 在 selenium webdriver 中打开新选项卡,或者如何使用 selenium webdriver 使用动作类在 selenium 中按 ctrl + T [重复]
如何使用selenium webdriver来判断一个网页加载完毕
如何使用 C# 在 Selenium WebDriver (Selenium 2) 中最大化浏览器窗口?