阅读使用硒的webdriver的JavaScript变量(Reading JavaScript va

2019-07-17 11:39发布

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

我搬到既fooreturnFoo()的外部$(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测试,并做它的断言。

这可能不是做最有效的方式,但如果别人有更好的解决方案,请让我知道。

Answer 1:

在Ruby中,你可以使用page.execute_script来评估一个JavaScript变量(如果是从Web浏览器的范围accessable)。 它看起来像有在Java中类似的方法在这里 。

编辑:这可能是一个用例是更适合一个JavaScript单元测试框架,如茉莉花 。



Answer 2:

所有你需要做的是:

Object val = js.executeScript("return returnFoo();");

这会给你你在找什么。



Answer 3:

没有JavaScript函数需要进行定义。 也不是alert()需要。

Object result = js.executeScript("return globalVar");

对于Python:

result = driver.execute_script("return globalVar")


Answer 4:

试试这个:

page.evaluate_script("script code")
page.execute_script("script code")
page.find("#id").click


文章来源: Reading JavaScript variables using Selenium WebDriver