Skip to content

Page#evaluate和Page#evaluateHandle方法介绍

yong fan edited this page Dec 17, 2024 · 1 revision

1、 Page.evaluate() 方法

Page#evaluate 的作用是 在页面内指定一段 JS 函数,这段 JS 函数就是Page#evaluate方法的第一个参数,返回的是 该 JS 函数执行的结果,下面给一个示例:

 	Object result =  page.evaluate("() => console.log('hello', 5, {foo: 'bar'})");
	System.out.println(result) //打印 null,因为执行的 JS 函数没有返回值

你可以传递字符串而不是函数(建议使用函数):

    page.evaluate("console.log('hello', 5, {foo: 'bar'})");

为了获得最佳的 体验,你应该传入 函数:

    page.evaluate("() => console.log('hello', 5, {foo: 'bar'})");

你可以传递参数给执行的 JS 函数:

page.evaluate("async (arg1,arg2,arg3,arg4,arg5) =>{\n" +
                    "  console.log(null == undefined)\n" +
                    "  console.log(-0 == -0.0)\n" +
                    "  console.log(arg1 == null)\n" +
                    "  console.log(arg2 == undefined)\n" +
                    "  console.log(arg3 == -0.0)\n" +
                    "  console.log(arg4 == Infinity)\n" +
                    "  console.log(arg5 == -Infinity)\n" +
                    "}", null, null,Constant.Navigate_Zero,Constant.Infinity,Constant.Navigate_Infinity);
//该 JS 函数有五个参数,我们在 evaluate 方法上传递了5个参数给它
// Constant.Navigate_Zero = "-0"
// Constant.Infinity = "Infinity"
// Constant.Navigate_Infinity = "-Infinity"

给执行的 JS 函数传递的参数有 6 个特别的数值,下面一 一列举:

参数 协议:CDP 协议WebDriver-BIDI
null null null or PrimitiveValue.Null
undefined null null or PrimitiveValue.Undefined
-0 "-0" "-0"
NaN "NaN" "NaN"
Infinity "Infinity" "Infinity"
-Infinity "-Infinity" "-Infinity"

2、Page.evaluateHandle() 方法

Page.evaluateHandle() 方法的使用与 Page.evaluate() 一致。

Page.evaluate() 和 Page.evaluateHandle() 之间的唯一区别是 evaluateHandle 将返回封装在页内对象中的值。

JSHandle aHandle =  page.evaluateHandle("document");//获取页面的document对象

//返回的 JSHandle 还可以作为参数传递
JSHandle resultHandle =  page.evaluateHandle(“body => body.innerHTML”, aHandle);

大多数情况下,此函数返回 JSHandle,但如果 执行的JS函数 返回对元素的引用,则会返回 ElementHandledle:

JSHandle button = page.evaluateHandle("() => document.querySelector('button')")
button.asElement().click() //JSHandle 转 ElementHandle,然后执行click