开发者问题收集

WebDriver 抛出异常:TypeError:JSON.stringify 不是一个函数

2023-07-02
302

我正在使用 java 进行 selenium 自动化。使用的 Selenium 版本:4.10.0

虽然我看到了两个选项卡(1. 父选项卡主页和 2. 子选项卡),但是当我通过以下代码切换到子选项卡时,我没有看到抛出任何类型的异常。但是当我执行任何操作(例如单击子窗口中的任何按钮)时,它都会引发异常“TypeError:JSON.stringify 不是函数”。

以下是代码片段。

//循环直到找到新的窗口句柄

    for (String windowHandle : driver.getWindowHandles()) {
        
        if(!originalWindow.contentEquals(windowHandle)) {
            System.out.println("Child win : "+windowHandle);
            driver.switchTo().window(windowHandle);
            break;
        }
    }

driver.findElement(By.name("aspnetForm")).click();

有人可以告诉我为什么我会收到此错误“线程“main”中的异常 org.openqa.selenium.WebDriverException:未知错误:Runtime.callFunctionOn 引发异常:TypeError:JSON.stringify 不是函数”

Consloe 日志如下:

子窗口获胜:DEFC56C2E255CB00E7CF1C779B81E7EE 线程“main”中的异常org.openqa.selenium.WebDriverException:未知错误:Runtime.callFunctionOn 引发异常:TypeError:JSON.stringify 不是函数 在 buildError (:323:18) (会话信息:chrome=114.0.5735.199) 构建信息:版本:'4.10.0',修订版本:'c14d967899' 系统信息:os.name:'Windows 10',os.arch:'amd64',os.version:'10.0',java.version:'11.0.18' 驱动程序信息:org.openqa.selenium.chrome.ChromeDriver 命令:[748156ce82a3898c61c8bc461a5ecbbb,findElement {using=name, value=aspnetForm}] 功能{acceptInsecureCerts:false,browserName:chrome,browserVersion:114.0.5735.199,chrome:{chromedriverVersion:114.0.5735.90(386bc09e8f4f ...,userDataDir:C:\ Users \ baluz \ AppData \ Locala ...},goog:chromeOptions:{debuggerAddress:localhost:58574},networkConnectionEnabled:false,pageLoadStrategy:normal,platformName:windows,代理:Proxy(),se:cdp:ws://localhost:58574 / devtoo ...,se:cdpVersion:114.0.5735.199,setWindowRect:true,strictFileInteractability:false,超时:{implicit:0,pageLoad:300000,脚本:30000}, unhandledPromptBehavior:dismiss 并通知,webauthn:extension:credBlob:true,webauthn:extension:largeBlob:true,webauthn:extension:minPinLength:true,webauthn:extension:prf:true,webauthn:virtualAuthenticators:true} 会话 ID:748156ce82a3898c61c8bc461a5ecbbb 位于 java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 位于 java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 位于 java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 位于java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490) 位于 org.openqa.selenium.remote.codec.w3c.W3CHttpResponseCodec.createException(W3CHttpResponseCodec.java:199) 位于 org.openqa.selenium.remote.codec.w3c.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:132) 位于 org.openqa.selenium.remote.codec.w3c.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:51) 位于 org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:191) 位于org.openqa.selenium.remote.service.DriverCommandExecutor.invokeExecute(DriverCommandExecutor.java:196) 位于 org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:171) 位于 org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:531) 位于 org.openqa.selenium.remote.ElementLocation$ElementFinder$2.findElement(ElementLocation.java:165) 位于 org.openqa.selenium.remote.ElementLocation.findElement(ElementLocation.java:66) 位于org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:350) 位于 org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:344) 位于 com.basePage.EX3.main(EX3.java:91)

2个回答

该网站一定对顶级 JSON 对象做了一些操作。 例如,如果该页面上的脚本在全局范围内执行此操作:

JSON = "{}"

那么 JSON.stringify 将未定义。显然,Selenium 依靠它将内容来回传递到 Python

pguardiario
2023-07-06

这是最新版 Chrome 浏览器的问题。

经过几次分析,只发现了三种解决方法

  1. 使用旧版 Chrome 步骤 1:卸载 Chrome 步骤 2:从以下路径删除 Chrome 数据 %LOCALAPPDATA%\Google\Chrome\User Data 步骤 3:通过 FileHippo、Chromium Cypress、SlimJet 下载旧版 Chrome。等

安装旧版 chrome 浏览器的步骤

现在,您使用 chromium 浏览器运行脚本,它将按预期工作。

  1. 案例 2:使用 javascript 文件 基本上,您应该做的是在执行任何查找元素或发送键操作之前运行一段 JS 代码来定义 JSON.stringify 方法,因为我的解决方案是使用 (JavascriptExecutor)webdrive.execute() 来执行此操作,您需要的 JS 代码如下,您也可以在 JSON-js/json2.js 中找到它

保存此 javascript 文件并使用执行它javascriptexecutor

JavascriptExecutor obj = (JavascriptExecutor) driver;

obj.executeScript("json2.js", args);

  1. 使用 Firefox 浏览器,我能够使用以下代码顺利运行我的自动化脚本,该代码用于等待然后执行操作,对我来说效果很好。

new WebDriverWait(driver, 20).until(driver -> ((JavascriptExecutor) driver).executeScript("return document.readyState").equals("complete"));

该问题出在最新版本的 Chrome 浏览器上,我希望它会在后续版本中得到修复。

Balaji Singh .Y
2023-07-20