首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Selenium JavaScript WebDriver读取WebDriver变量

使用Selenium JavaScript WebDriver读取WebDriver变量
EN

Stack Overflow用户
提问于 2012-12-21 17:11:55
回答 3查看 100.2K关注 0票数 69

我正在使用Selenium WebDriver (Java)和TestNG在我创建的网站上做一些测试。在这个网站中,我也有JavaScript,在一些函数中,它返回值并通过console.log()将值输出到浏览器控制台。

我想知道Selenium WebDriver是否有一种简单的方法来访问这些JavaScript信息,这样我就可以使用TestNG.执行断言了。

我对Selenium非常陌生,但我知道您可以这样做:

代码语言:javascript
复制
WebDriver driver = new ChromeDriver();
driver.findElement(By.id("btn")).click();

那么,我是否可以使用WebDriver在站点上读取JavaScript呢?

澄清

人们似乎在假设我试图通过Selenium“执行”JavaScript代码。

事实并非如此。相反,我尝试使用Selenium存储已经定义的JavaScript变量。

基本上,我希望Selenium能够获取JavaScript变量的值,在本地存储它,然后对它进行断言测试。

尝试1

假设我的网站有以下JS代码:

代码语言:javascript
复制
$(document).ready(function() {
    var foo = $(#"input-field-val").val();

    function returnFoo() {
        return foo;
    }
});

根据我的阅读和理解,在我的单独的Selenium测试文件(Selenium.java)中,我应该能够这样做?:

代码语言:javascript
复制
public class Selenium {
    WebDriver driver = new FirefoxDriver();
    JavascriptExecutor js = (JavascriptExecutor) driver;

    @Test
    public void testSample() {
        driver.get("www.mywebsite.com");
        js.executeScript("alert(returnFoo());");
    }
}

我做了一些类似于上面的事情,但没有弹出警告框。相反,我收到一条错误消息:

代码语言:javascript
复制
Exception in thread "main" org.openqa.selenium.WebDriverException: ReferenceError: returnFoo is not defined

我很确定当它说JS变量时,我不明白它意味着什么

不应该是闭包或局部变量的一部分。

我还尝试在$(document).ready(function()...之上定义一个全局变量,并且设置在function returnFoo()中,但仍然不能工作。

企图2

我把fooreturnFoo()都移到了$(document).ready(function()...之外。它修正了我在上面尝试1中得到的ReferenceError消息。

我还为foo提供了一个值,所以我的JS代码如下所示:

代码语言:javascript
复制
var foo = "Selenium test run";

$(document).ready(function() {
...
});

function returnFoo() {
    return foo;
}

现在,我很难将returnFoo()的返回分配给Selenium测试中的局部变量。以下是我的尝试:

代码语言:javascript
复制
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的值。

解决方案

因此,这是我对我的问题提出的解决方案,这要归功于下面Martin的解决方案。

在JavaScript文件中,我创建了一个var和一个setter/getter函数,如下所示:

index.js

代码语言:javascript
复制
var seleniumGlobal;

$(document).ready(function() {
...
)};

function setSG(toSet) {
    seleniumGlobal = toSet;
}

function getSG() {
    return seleniumGlobal;
}

SampleTest.java

代码语言:javascript
复制
// 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变量时,我就可以通过Selenium测试调用它,并对它执行断言。

这可能不是最有效的方法,但如果其他人有更好的解决办法,请告诉我。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-21 17:20:55

在Ruby中,您可以使用page.execute_script来计算JavaScript变量(如果可以从web浏览器的作用域访问它)。在Java here中似乎有类似的方法。

编辑:这可能是一个更适合于JavaScript单元测试框架(如Jasmine )的用例。

票数 14
EN

Stack Overflow用户

发布于 2013-02-15 16:25:23

你所要做的就是:

代码语言:javascript
复制
Object val = js.executeScript("return returnFoo();");

这会给你你想要的东西。

票数 53
EN

Stack Overflow用户

发布于 2013-10-04 00:37:38

不需要定义JavaScript函数。也不需要alert()

代码语言:javascript
复制
Object result = js.executeScript("return globalVar");

对于Python:

代码语言:javascript
复制
result = driver.execute_script("return globalVar")
票数 31
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13994393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档