如何在Selenium中从浏览器上下文获取变量并在获取后停止断点?

问题描述 投票:0回答:1

在浏览器的开发工具中,我设置了一个XHR断点,当页面执行XHR时,它会在断点处暂停。然后我可以在控制台中打印一些变量。但是当我用 selenium 访问同一个变量时,它会抛出变量未定义的错误。

是否可以在 selenium 中访问开发工具控制台的相同上下文。

从控制台:

t
Object { type: "POST", data: '{"comm":{"cv":4747474,"ct

来自硒:

dirver.execute_script('''console.log(t)''')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "D:\Programs\python\Lib\site-packages\selenium\webdriver\remote\webdriver.py", line 884, in execute_script
    return self.execute(command, {
           ^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\Programs\python\Lib\site-packages\selenium\webdriver\remote\webdriver.py", line 430, in execute
    self.error_handler.check_response(response)
  File "D:\Programs\python\Lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 247, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.JavascriptException: Message: ReferenceError: t is not defined

我还有一个问题,现在我需要手动打开devtools并在selenium打开页面后手动设置断点。有可能用硒来做吗?我搜索了很多,但没有结果。

python selenium-webdriver devtools
1个回答
0
投票

如果我理解正确,您可以将变量存储在全局中,这样您就可以从 Selenium 执行上下文中获取它。

所以你的代码会做这样的事情:

  1. 使用打开的开发工具打开 chrome,使用
    --auto-open-devtools-for-tabs
    参数
  2. 编写一些逻辑,将变量传递到全局对象(例如“窗口”)中
  3. 实现异步等待函数,等待变量为真。
  4. 定义获取该变量的函数,并在其为真时记录它。
  5. 将该函数传递到等待函数中,并为其
    await
  6. 致电
    debugger

示例:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument("--auto-open-devtools-for-tabs");

driver = webdriver.Chrome(chrome_options)

wait_for_var_script = """
let waitFor = async (action, pollIntervalMs = 1000) => {
  let result;
  while (!result) {
    console.log('Waiting for result');
    result = await action();
    await new Promise(resolve => setTimeout(resolve, pollIntervalMs));
  }
  return result;
};

const getSomeObject = () => {
    let _result = window.t;
    _result && console.log(_result);
    return _result;
};

setTimeout(() => window.t = { a: '1' }, 10000);
await waitFor(getSomeObject);
debugger;
"""

driver.get('https://example.com/')
driver.execute_script(wait_for_var_script)
© www.soinside.com 2019 - 2024. All rights reserved.