javascript - Selenium webdriver 中 Javascript 函数的返回值

标签 javascript java selenium

如何使用 selenium webdriver 从 javascript 函数返回数组? 我尝试过的代码是 -

System.setProperty("webdriver.chrome.driver", "D:/chromedriver_win32/chromedriver.exe");
    wd=new ChromeDriver();
    wd.navigate().to("http://www.makemytrip.com");
    wd.manage().window().maximize();
    Thread.sleep(5000);
    wd.findElement(By.id("from_typeahead1")).click();
    WebElement span= wd.findElement(By.xpath(".//*[@id='one_round_default']/div/div[1]/div/div[1]/span/span/div[1]/span"));

    JavascriptExecutor jse = (JavascriptExecutor)wd;
    jse.executeScript("window.showList = function(){"+
            "var source=[];"+
            "var inputs = arguments[0].getElementsByTagName('div');"+
            "for(var i = 0; i < inputs.length; i++) {"+
                "source.push(inputs[i])"+
            "}"+
            "return source;"+
            "};",span);

    /*List<?> al =  (List<?>) jse.executeScript(
            "var source = [];"+
            "var inputs = arguments[0].getElementsByTagName('div');"+
            "for(var i = 0; i < inputs.length; i++) {"+
               "source.push(inputs[i])"+      
            "}"+
            "return source;"                 
            ,span);*/

    List<?> al =  (List<?>) jse.executeScript("showList();");
    for(Object web:al){
        System.out.println(((WebElement) web).getText());
    }

我收到一个异常,指出 - “org.openqa.selenium.WebDriverException:未知错误:无法读取未定义的属性“getElementsByTagName”。”

顺便说一句,当我尝试这段代码时,它工作得很好 -

System.setProperty("webdriver.chrome.driver", "D:/chromedriver_win32/chromedriver.exe");
    wd=new ChromeDriver();
    wd.navigate().to("http://www.makemytrip.com");
    wd.manage().window().maximize();
    Thread.sleep(5000);
    wd.findElement(By.id("from_typeahead1")).click();
    WebElement span= wd.findElement(By.xpath(".//*[@id='one_round_default']/div/div[1]/div/div[1]/span/span/div[1]/span"));

    List<?> al =  (List<?>) jse.executeScript(
            "var source = [];"+
            "var inputs = arguments[0].getElementsByTagName('div');"+
            "for(var i = 0; i < inputs.length; i++) {"+
               "source.push(inputs[i])"+      
            "}"+
            "return source;"                 
            ,span);

    for(Object web:al){
        System.out.println(((WebElement) web).getText());
    }

但我想首先创建一个返回数组的函数,然后在需要时调用该函数。如何实现这一目标?另外,如果可能的话,我如何使用外部 .js 文件来执行相同的逻辑并在我的脚本中使用它? 任何帮助将不胜感激。提前致谢 !

最佳答案

正如您所发现的,executeScript 方法使用第一个参数创建一个函数,并将其余参数传递给它。

要突破此函数的范围,只需在全局对象中定义某些内容或操作 DOM。

例如,从测试中某处的第一个代码片段调用 jse.executeScript("window.showList = function(){...),但不要将其传递给 span 参数。这在全局范围内定义了 showList 函数。

稍后您可以简单地执行jse.executeScript("return showList.apply(null,arguments)", span)来调用它。

同样,您可以使用代码片段包含外部脚本

driver.executeScript("var s = document.createElement('script'); s.type = 'text/javascript'; s.src = arguments[0]; document.body.appendChild(s);", scriptUrl);

(或者简单地对 URL 进行硬编码)。

对于这两种情况,请记住仅运行定义/包含调用一次,以避免重新定义事物。

关于javascript - Selenium webdriver 中 Javascript 函数的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34395985/

相关文章:

Javascript:使用 crypto.getRandomValues 生成一个范围内的随机数

javascript - 无法通过返回键终止应用程序(*应用程序中没有退出菜单)

javascript - HTMLCanvas 'getContext' 不是受支持的属性或方法

java - JPQL查询连接中列的最大int值

java - 如何测试 json object1 是 json object2 的子集

javascript - Python Selenium 无法通过链接。帕斯特宾爬行

vb.net - 根据 Selenium 中的动态索引从下拉列表中选择一个值

javascript - 使用 NextJS 从页面(子)组件调用布局(父)组件函数

java - 无法从 Eclipse 市场安装 TestNG,出现以下错误 :

java - Android如何保存状态arraylist