使用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

我已经移动fooreturnFoo()之外的$(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方法设置了我的seleniumGlobalvariables,我可以通过我的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