首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python & Selenium:如何使用CDP (Chrome协议)在DevTools中获取元素

Python & Selenium:如何使用CDP (Chrome协议)在DevTools中获取元素
EN

Stack Overflow用户
提问于 2022-04-28 12:57:02
回答 1查看 1.7K关注 0票数 3

我想用Chrome DevTools获取元素中的所有源代码。

虽然我尝试了以下代码,但这些值与上面的代码不匹配。

代码语言:javascript
复制
body = driver.execute_cdp_cmd("DOM.getOuterHTML", {"backendNodeId": 1})
print(body)

是否有可能获得CDP的所有源代码?如何使用CDP获得所有源代码?

我知道另一种方法来刮源代码。但是我想知道如何在DevTools中获取元素中的源代码。(F12)

EN

回答 1

Stack Overflow用户

发布于 2022-04-30 23:37:37

编辑:参见末尾的CDP解决方案

假设"f12源代码“指的是”当前DOM,在它被JS或其他任何东西操作之后,而不是原始源代码“。

因此,请考虑以下html页面:

代码语言:javascript
复制
<!doctype html>

<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Hi</title> 
  <script>
      document.addEventListener("DOMContentLoaded", function(){
   setTimeout(function(){
    document.getElementById("test").innerHTML+=" World!"
   }, 3000)
});
  </script>
</head>

<body>
  <h1 id="test">Hello</h1>
 
</body>
</html>

页面加载3秒后,h1将包含"Hello!“

这正是我们在运行以下代码时所看到的:

代码语言:javascript
复制
from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()
driver.get("http://localhost:8000/") # replace with your page
sleep(6) # probably replace with smarter logic
html = driver.execute_script("return document.documentElement.outerHTML")
print (html)

产出:

代码语言:javascript
复制
<html lang="en"><head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Hi</title> 
  <script>
      document.addEventListener("DOMContentLoaded", function(){
   setTimeout(function(){
    document.getElementById("test").innerHTML+=" World!"
   }, 3000)
});
  </script>
</head>

<body>
  <h1 id="test">Hello World!</h1>
 


</body></html>

编辑,使用 https://chromedevtools.github.io/devtools-protocol/ 代替:

您所描述的行为是奇怪的,但好的,让我们找一个不同的解决方案。

在python中的selenium 4中(到目前为止)似乎有对CDP的有限支持。到目前为止(2022年5月),python中没有driver.getDevTools(),只有java和JS (Node) (?)。

不管怎么说,我甚至不确定那会对我们有帮助。

到目前为止,原始CDP就足够了:

代码语言:javascript
复制
from selenium import webdriver
from time import sleep
# webdriver.remote.webdriver.import_cdp()

driver = webdriver.Chrome()
driver.get("http://localhost:8000/")
sleep(6)

doc = driver.execute_cdp_cmd(cmd="DOM.getDocument",cmd_args={})
doc_root_node_id = doc["root"]["nodeId"]
result = driver.execute_cdp_cmd(cmd="DOM.getOuterHTML",cmd_args={"nodeId":doc_root_node_id})
print (result['outerHTML'])

指纹:

代码语言:javascript
复制
<!DOCTYPE html><html lang="en"><head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Hi</title> 
  <script>
      document.addEventListener("DOMContentLoaded", function(){
   setTimeout(function(){
    document.getElementById("test").innerHTML+=" World!"
   }, 3000)
});
  </script>
</head>

<body>
  <h1 id="test">Hello World!</h1>
 


</body></html>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72044097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档