gpt4 book ai didi

selenium - 如何使用 Selenium 和 python 单击 devtools 控制台选项卡

转载 作者:行者123 更新时间:2023-12-04 07:18:48 26 4
gpt4 key购买 nike

我有这个代码:

async def acess_all():                         
def acess_localhost():
option = Options()
option.add_argument("--no-sandbox")
option.debugger_Address="127.0.0.1:8081"
driver = webdriver.Chrome(options=option)
driver.get("http://127.0.0.1:8081")
wait = WebDriverWait(driver, 5)
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'a.item'))).click()
try:
t = threading.Thread(target=get_infos)
t.start()
os.system("chromium --remote-debugging-port=8081 https://google.com")
except:
print("Error!")

我需要什么:

伙计们,如您所见,这段代码在 Google 页面上打开了 Chrome 浏览器,而我的 Selenium 代码在本地主机上打开了浏览器,因为它正在访问远程调试地址指向的位置,但我无法访问控制台devtools 选项卡,我需要使用 Selenium 访问此选项卡并运行 javascript 命令以 json 格式复制 cookie,但我不能,如何访问 devtools 控制台选项卡?

最佳答案

我相信我已经找到了一种在控制台中运行 javascript 命令并获取返回值的方法(使用 selenium,如问题中所述)。

注意:我在 Windows 计算机上运行它,但这个想法在不同的操作系统上应该保持不变。您可能需要调整此代码中的一些内容。此外,必须事先关闭所有 Chrome session 才能使其正常工作。

好的,除非我错误地解释了你的问题(如果我理解了请告诉我),这是你希望发生的事情的基本顺序:

  1. 打开常规 chrome 浏览器(常规,我指的不是 selenium,而是常规 chrome.exe 或 Google Chrome.app)到 google.com 并设置调试端口(我假设这就是你在运行时所做的此命令:chromium --remote-debugging-port=8081 https://google.com)
  2. 打开 Chromedriver (Selenium) 并转到位于 127.0.0.1:8081 的本地托管调试器窗口
  3. 在 127.0.0.1:8081 enter image description here 的可用窗口列表中选择“Google”窗口选项
  4. 开发工具窗口打开后,移至“控制台”选项卡
  5. 最后,在控制台的输入框中运行一些 Javascript 并以某种方式获取 cookie 的返回值

您已经完成了代码中的前几项 (1-3),但您需要帮助才能弄清楚其余部分。我想我找到了一种方法。

假设您已经在 Chrome 浏览器上打开了 google.com 窗口在本地主机上打开了 127.0.0.1:8081 窗口,您现在需要做的就是访问控制台。这是我的 chromedriver (selenium) 浏览器屏幕此时的样子,仅供引用。 show the window before clicking anything

我们将首先等待特定元素 (devtools-elements-breadcrumbs) 加载到页面上。我们等待这一点,以确保页面已加载到足以进行导航。我通过查看驱动程序 page_source 找到了这个元素。以下是我们等待它的方式:

wait.until(EC.presence_of_element_located((By.TAG_NAME, "devtools-elements-breadcrumbs")))

找到面包屑元素后,我们可以通过发送 shortcut 移动到控制台窗口到 chromedriver 浏览器,告诉它在检查器窗口中向右移动一个选项卡(到控制台)。命令是 Control + ] (Windows/Linux) 或 Command + ] (Mac),转到下一个面板。这就是我们将该快捷方式发送到 selenium 窗口的方式(再次使用 Windows):

click_console = ActionChains(driver)
click_console.key_down(Keys.CONTROL).send_keys(']').key_up(Keys.CONTROL).perform()

或在 Mac 上,

click_console = ActionChains(driver)
click_console.key_down(Keys.COMMAND).send_keys(']').key_up(Keys.COMMAND).perform()

移动到控制台后,我们现在必须等待控制台区域加载,因此我们等待所有 CodeMirror 类元素(再次使用 driver.page_source 找到)

# wait for console area to open
wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, "CodeMirror")))

现在要做的最后一件事是将 javascript 命令发送到控制台。在此示例中,我正在搜索 APISID cookie。

cookie_name = "SEARCH_SAMESITE"
# javascript find the cookie
# https://stackoverflow.com/a/59603055/11073064
js_command = '(\"; \" + document.cookie).split(\"; {}\").pop().split(\';\').shift();'.format(cookie_name)
# send the command to the selenium webbrowser
send_js_command = ActionChains(driver)
send_js_command.send_keys(js_command, Keys.ENTER).perform()

show the console after running the javascript并在运行该命令后获取控制台中输出的值:

# wait for return value span tag to be found
element = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'span.object-value-string.source-code')))
value = element.text
driver.close()

这是我使用的完整代码(在 Windows 上)。

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import threading
from selenium.webdriver.chrome.options import Options
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys
import os


def start_chrome_browser_with_debug():
# this is the path to your regular google chrome browser, not selenium chromedriver
# note the chrome.exe, not chromedriver.exe.
# point the path to your regular chrome browser
os.system('"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --remote-debugging-port=8081 https://google.com')


cookie_name = "SEARCH_SAMESITE"
js_command = '(\"; \" + document.cookie).split(\"; {}\").pop().split(\';\').shift();'.format(cookie_name)

chrome_browser = threading.Thread(target=start_chrome_browser_with_debug)
chrome_browser.start()

option = Options()
option.add_argument("--no-sandbox")
option.debugger_Address = "127.0.0.1:8081"
driver = webdriver.Chrome(options=option)
driver.get("http://127.0.0.1:8081")
wait = WebDriverWait(driver, 5)
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'a.item'))).click()
wait.until(EC.presence_of_element_located((By.TAG_NAME, "devtools-elements-breadcrumbs")))
click_console = ActionChains(driver)
click_console.key_down(Keys.CONTROL).send_keys(']').key_up(Keys.CONTROL).perform()

wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, "CodeMirror")))
send_js_command = ActionChains(driver)
send_js_command.send_keys(js_command, Keys.ENTER).perform()
element = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'span.object-value-string.source-code')))
value = element.text
driver.close()
os.system('taskkill /F /IM chrome.exe /T')
print(value)

关于selenium - 如何使用 Selenium 和 python 单击 devtools 控制台选项卡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68630753/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com