python+playwright 学习-40.page.evaluate()执行JavaScript脚本

前言

大家在学selenium的时候,对于页面上的有些元素不好操作的时候,可以使用driver.execute_script() 方法执行JavaScript脚本。 在playwright 中也有类似的方法,使用page.evaluate()执行JavaScript脚本。 page.evaluate()和page.evaluate_handle()之间的唯一区别是page.evaluate_handle()返回JSHandle。

  • page.evaluate() 返回调用执行的结果
  • page.evaluate_handle()返回JSHandle

page.evaluate()

此方法返回evaluate() 返回执行JavaScript脚本的结果,使用示例

简单示例

代码语言:javascript
复制
print(page.evaluate("1 + 2")) # prints "3"
x = 10
print(page.evaluate(f"1 + {x}")) # prints "11"

也可以是执行一个函数

代码语言:javascript
复制
res = page.evaluate("() => 'Hello World!'",)
print(res)   # Hello World!

函数也可以带上参数

代码语言:javascript
复制
res = page.evaluate("([a, b]) => a+b+'world'", ["hello", 'xx'])
print(res)  # helloxxworld

如果传递给page.evaluate()的函数返回一个不可序列化的值,则page.evaluate()解析为undefined

操作 web 网页示例

执行document.title 获取页面的title

代码语言:javascript
复制
    page.goto("https://www.baidu.com/")
title = page.evaluate('document.title')
print(title)
page.pause()</code></pre></div></div><p>登录网站示例</p><div class="rno-markdown-code"><div class="rno-markdown-code-toolbar"><div class="rno-markdown-code-toolbar-info"><div class="rno-markdown-code-toolbar-item is-type"><span class="is-m-hidden">代码语言:</span>javascript</div></div><div class="rno-markdown-code-toolbar-opt"><div class="rno-markdown-code-toolbar-copy"><i class="icon-copy"></i><span class="is-m-hidden">复制</span></div></div></div><div class="developer-code-block"><pre class="prism-token token line-numbers language-javascript"><code class="language-javascript" style="margin-left:0"># 上海悠悠 wx:283340479

blog:https://www.cnblogs.com/yoyoketang/

page = browser.new_page()
page.goto(&#34;http://127.0.0.1/login.html&#34;)

js = &#34;&#34;&#34;
document.getElementById(&#39;username&#39;).value=&#39;yoyo&#39;;
document.getElementById(&#39;password&#39;).value=&#39;******&#39;;
document.getElementById(&#39;loginBtn&#39;).click();
&#34;&#34;&#34;

page.evaluate(js)</code></pre></div></div><p>page.evaluate() 方法一般用于页面上操作元素,无法正常操作的情况,可以用执行JavaScript脚本协助解决。</p><h2 id="81n9p" name="page.evaluate_handle()%E8%BF%94%E5%9B%9EJSHandle"><strong>page.evaluate_handle()返回JSHandle</strong></h2><p>page.evaluate()和page.evaluate_handle()之间的唯一区别是page.evaluate_handle()返回JSHandle。</p><div class="rno-markdown-code"><div class="rno-markdown-code-toolbar"><div class="rno-markdown-code-toolbar-info"><div class="rno-markdown-code-toolbar-item is-type"><span class="is-m-hidden">代码语言:</span>javascript</div></div><div class="rno-markdown-code-toolbar-opt"><div class="rno-markdown-code-toolbar-copy"><i class="icon-copy"></i><span class="is-m-hidden">复制</span></div></div></div><div class="developer-code-block"><pre class="prism-token token line-numbers language-javascript"><code class="language-javascript" style="margin-left:0">    a_handle = page.evaluate_handle(&#34;document.body&#34;)
result_handle = page.evaluate_handle(&#34;body =&gt; body.innerHTML&#34;, a_handle)
print(result_handle.json_value())
result_handle.dispose()</code></pre></div></div>