使用Selenium WebDriver读取JavaScriptvariables
我使用Selenium WebDriver(Java)和TestNG在我创build的网站上进行一些testing。 在这个网站中,我也有JavaScript,在一些函数中,它通过console.log()
函数返回值并将值输出到浏览器控制台。
我想知道是否有一个简单的方法让Selenium WebDriver访问这些JavaScript信息,以便我可以使用TestNG执行断言。
我对selenium很新,但我知道你可以做这样的事情:
WebDriver driver = new ChromeDriver(); driver.findElement(By.id("btn")).click();
那么有没有什么类似的,我可以使用WebDriver
来读取网站上的JavaScript?
澄清
看起来人们正在假设我正试图通过Selenium“执行”JavaScript代码。
事实并非如此。 相反,我试图使用Selenium存储已定义的JavaScriptvariables。
基本上,我希望Selenium能够获取JavaScriptvariables的值,将其存储在本地,然后对其进行断言testing。
尝试1
说我有我的网站的以下JS代码:
$(document).ready(function() { var foo = $(#"input-field-val").val(); function returnFoo() { return foo; } });
从我阅读和理解的东西,在我单独的Seleniumtesting文件(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());"); } }
我做了类似于上面的东西,但没有提示框popup。 相反,我收到一条错误消息:
Exception in thread "main" org.openqa.selenium.WebDriverException: ReferenceError: returnFoo is not defined
我很确定我不明白当它说JSvariables时它的含义
不应该是闭包或局部variables的一部分
我也尝试在$(document).ready(function()...
之上定义一个全局variables,并且在function returnFoo()
但仍然不起作用。
尝试2
我已经移动foo
和returnFoo()
之外的$(document).ready(function()...
有固定的ReferenceError
消息,我正在上面的尝试1 。
我也给了foo
一个值,所以我的JS代码看起来像这样:
var foo = "Selenium test run"; $(document).ready(function() { ... }); function returnFoo() { return foo; }
现在,在我的Seleniumtesting中,将returnFoo()
的返回值分配给一个局部variables的时间已经很艰难了。 以下是我所尝试的:
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 test run”的实际值。
尝试2 – 解决scheme
它看起来像如果我做的Object val = js.executeScript("alert(returnFoo());");
我得到foo
的价值。
解
所以下面是Martin Foot提供的解决scheme。
在我的JavaScript文件中,我创build了一个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中的一些代码通过setter方法设置了我的seleniumGlobal
variables,我可以通过我的Seleniumtesting来调用它,并对其进行断言。
这可能不是最有效的方法,但如果别人有更好的解决scheme,请让我知道。
在Ruby中,您可以使用page.execute_script
来评估JavaScriptvariables(如果可以从Web浏览器的范围访问它)。 看起来这里 Java中有类似的方法。
编辑:这可能是一个更适合JavaScriptunit testing框架(如Jasmine)的用例 。
你所要做的就是:
Object val = js.executeScript("return returnFoo();");
那会给你你正在寻找的东西。
没有JavaScript函数需要定义。 也不需要alert()
。
Object result = js.executeScript("return globalVar");
对于Python:
result = driver.execute_script("return globalVar")
尝试这个:
page.evaluate_script("script code") page.execute_script("script code") page.find("#id").click