当前位置: 首页 > 知识库问答 >
问题:

使用Selenium WebDriver读取JavaScript变量

严安志
2023-03-14

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

WebDriver driver = new ChromeDriver();
driver.findElement(By.id("btn")).click();

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

假设我的网站有以下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()中,但仍然不起作用。

var foo = "Selenium test run";

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

function returnFoo() {
    return foo;
}
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);
    } 

看起来,如果我执行object val=js.executescript(“alert(returnFoo());”);,就会得到foo的值。

这是我对我的问题提出的解决方案,多亏了下面Martin Foot的解决方案。

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

var seleniumGlobal;

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

function setSG(toSet) {
    seleniumGlobal = toSet;
}

function getSG() {
    return seleniumGlobal;
}
// 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);
    }
}

共有1个答案

吴品
2023-03-14

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

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

 类似资料:
  • 问题内容: 我正在使用Selenium WebDriver(Java)和TestNG在我创建的网站上进行一些测试。在这个网站上,我也有JavaScript,并且在某些功能中,它返回值,并通过将值输出到浏览器控制台。 我想知道Selenium WebDriver是否有一种简单的方法来访问某些JavaScript信息,以便可以使用TestNG执行断言。 我对Selenium还是很陌生,但我知道您可以执

  • 问题内容: 如何从JavaScript读取/访问JSP变量? 问题答案: 要么 或完整的例子 注意:在渲染输入之前先对其进行消毒,这可能会打开很多XSS可能性

  • 问题陈述:我试图在网页上获取span标记的值。*该网页上有多个span标记,其中我需要4个。

  • 问题内容: 无法使AJAX正常工作!我在网站上有一个字幕,可以正常使用!但是我希望它在文本文件中找到字幕的文本,并且希望它读取文本文件中的文本(一行),并将其分配给名为的变量,该变量是脚本中的全局变量标签。 当我运行网站(本地IIS)时,字幕文本为:“未定义”(不带引号)。 为什么不将文本分配给变量? 编辑: 一百万感谢@kuncajs,因为他指出我忘了调用该函数!:)固定!感谢其他人! 问题答案

  • 我正在使用Selenium(Java版本)测试一个基于OpenLayers的API。 我想测试一个使用的功能。控制修改功能。我想单击绘制的特征(SVG),然后拖动并检查它们是否存在、可见或隐藏。 我已经画了一个多边形,并且选择了它。见下图: 这些SVG元素的HTML如下所示: 假设我想选择红点。 我试过: 但是它总是返回一个空列表。 我做错了什么?有人能帮我吗? 多谢了。 编辑1-功能:垂直显示可

  • 问题内容: 因此,如果有一个链接到网页的css文件,例如: 并且我想读取某个属性,例如div具有className =’layout’,并且我想使用JavaScript读取此属性的详细信息,我该怎么做? 我搜索了很多,但几乎没有运气,请提出建议。 问题答案: 您有两种选择: 手动枚举和解析对象(不建议使用,除非您要获取由某个选择器定义的所有特定样式属性)。 创建与选择器匹配的元素,然后使用或(IE