我使用webdriver的硒(JAVA)和TestNG做一个网站,我创建了一些测试。 在这个网站,我也有JavaScript和中的一些功能,它通过返回值,同时输出值,对浏览器控制台console.log()
我在想,如果有一个简单的方法对硒的webdriver访问一些这方面JavaScript的信息,所以我可以用TestNG进行断言。
我是很新的硒,但我明白,你可以这样做:
WebDriver driver = new ChromeDriver();
driver.findElement(By.id("btn")).click();
那么,有没有什么类似的,我可以用做WebDriver
阅读JavaScript的网站上?
澄清
它看起来像人都是这样,我试图以“执行”通过硒JavaScript代码的假设。
那是不是这样的。 相反,我尝试存储使用Selenium已定义JavaScript变量。
基本上,我想硒能够抓住JavaScript变量的值,将它存储在本地,然后在它上面做一个断言测试。
尝试1
说我对我的网站下面的JS代码:
$(document).ready(function() {
var foo = $(#"input-field-val").val();
function returnFoo() {
return foo;
}
});
从我阅读和理解,在我单独Selenium测试文件(Selenium.java),我应该可以做这样的事?:
public class Selenium {
WebDriver driver = new FirefoxDriver();
JavascriptExecutor js = (JavascriptExecutor) driver;
@Test
public void testSample() {
driver.get("www.mywebsite.com");
js.executeScript("alert(returnFoo());");
}
}
我做类似的东西上面,但没有提示框弹出的东西。 相反,我得到一个错误信息:
Exception in thread "main" org.openqa.selenium.WebDriverException: ReferenceError: returnFoo is not defined
我敢肯定,我不明白是什么时,其表示,这意味着JS变量
不应该是一个封闭或局部变量的一部分
我也试图定义上述一个全局变量$(document).ready(function()...
和设置内function returnFoo()
但仍然无法正常工作。
尝试2
我搬到既foo
且returnFoo()
的外部$(document).ready(function()...
。那有固定ReferenceError
我在上面尝试1获取消息。
我甲肝也给foo
的值,所以我的JS代码看起来是这样的:
var foo = "Selenium test run";
$(document).ready(function() {
...
});
function returnFoo() {
return foo;
}
现在,我有一个艰难的时间分配的返回returnFoo()
我Selenium测试中的局部变量。 以下是我已经尝试:
public static void main(String[] args) {
WebDriver driver = new FirefoxDriver();
JavascriptExecutor js = (JavascriptExecutor) driver;
driver.get("http://localhost:8080/HTML5TestApp/prod.html");
Object val = js.executeScript("window.returnFoo();");
System.out.println(val);
}
但是控制台显示null
,而不是“Selenium测试运行”的实际值。
尝试2 - 解决方案
它看起来像如果我做Object val = js.executeScript("alert(returnFoo());");
我得到的值foo
。
解
因此,这里的解决方案,我想出来瓦特/我要归功于以下马丁脚解决问题。
在我的JavaScript文件,我创建了一个var
,并像这样一个setter / getter函数:
index.js
var seleniumGlobal;
$(document).ready(function() {
...
)};
function setSG(toSet) {
seleniumGlobal = toSet;
}
function getSG() {
return seleniumGlobal;
}
SampleTest.java
// Do all the necessary imports
public class SampleTest {
WebDriver driver = new FirefoxDriver();
JavascriptExecutor js = (JavascriptExecutor) driver;
@Test
public void testPrintVal() {
String sgVal = (String) js.executeScript("alert(getSG());");
Assert.assertEquals("new value for seleniumGlobal", sgVal);
}
}
因此,只要在我的JavaScript的一些代码设置我seleniumGlobal
通过setter方法变量,我可以把它通过我的Selenium测试,并做它的断言。
这可能不是做最有效的方式,但如果别人有更好的解决方案,请让我知道。