使用python的seleniumbase库执行脚本时如何处理这个“脚本超时”错误?

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

我是Python新手,我正在使用Python的seleniumbase库抓取一个网站,我需要间歇性地运行这个获取脚本,但我意识到当响应时间超过大约950毫秒时,它会抛出脚本超时错误,但我可以看到浏览器网络选项卡中的获取响应。如果响应延迟时间低于 950 毫秒,此代码可以正常工作。

script = """
                return new Promise((resolve, reject) => {
                    var csrf = document.querySelector('meta[name="csrf-token"]').content;
                    var obj;
                
                    fetch("MyUrl", {
                        'headers': {
                            'accept': '/',
                            'accept-language': 'en-US,en;q=0.9',
                            'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
                            'sec-ch-ua': '"Chromium";v="116", "Not)A;Brand";v="24", "Google       Chrome";v="116"',
                            'sec-ch-ua-mobile': '?0',
                            'sec-ch-ua-platform': '"Windows"',
                            'sec-fetch-dest': 'empty',
                            'sec-fetch-mode': 'cors',
                            'sec-fetch-site': 'same-origin',
                            'x-csrf-token': csrf,
                            'x-requested-with': 'XMLHttpRequest'
                        },
                        'referrer': 'MyUrl',
                        'referrerPolicy': 'strict-origin-when-cross-origin',
                        'body': 'consularid=3&exitid=1&servicetypeid=1&calendarType=2&totalperson=1',
                        'method': 'POST',
                        'mode': 'cors',
                        'credentials': 'include'
                    })
                        .then(res => res.text())
                        .then(data => {
                            obj = data;
                            resolve(obj);
                        })
                        .catch(error => {
                            reject(error);
                        });
                });
                """
            obj_variable = sb.execute_script(script)

这是错误的一个例子:

Message: script timeout
  (Session info: chrome=116.0.5845.141)
Stacktrace:
    GetHandleVerifier [0x00007FF61E0352A2+57122]
    (No symbol) [0x00007FF61DFAEA92]
    (No symbol) [0x00007FF61DE7E25D]
    (No symbol) [0x00007FF61DEEF314]
    (No symbol) [0x00007FF61DED6FDA]
    (No symbol) [0x00007FF61DEEEB82]
    (No symbol) [0x00007FF61DED6DB3]
    (No symbol) [0x00007FF61DEAD2B1]
    (No symbol) [0x00007FF61DEAE494]
    GetHandleVerifier [0x00007FF61E2DEF82+2849794]
    GetHandleVerifier [0x00007FF61E331D24+3189156]
    GetHandleVerifier [0x00007FF61E32ACAF+3160367]
    GetHandleVerifier [0x00007FF61E0C6D06+653702]
    (No symbol) [0x00007FF61DFBA208]
    (No symbol) [0x00007FF61DFB62C4]
    (No symbol) [0x00007FF61DFB63F6]
    (No symbol) [0x00007FF61DFA67A3]
    BaseThreadInitThunk [0x00007FFAFEF07614+20]
    RtlUserThreadStart [0x00007FFB007C26B1+33]

我尝试在脚本代码中添加超时,但它不起作用,也许我没有做得正确

javascript python ajax fetch-api seleniumbase
1个回答
0
投票

运行 inisde selenium 脚本时,您似乎遇到了脚本超时问题。

您说过您尝试在脚本中添加超时,但效果不佳。

此问题的一个可能的解决方案是您可以直接在 Selenium 脚本的上下文中设置超时。您可以使用javascript本身的

setTimeout
函数。

您还可以利用

execute_async_script
不等待脚本执行,也不会出现超时错误。

代码的修改版本:

script = """
return new Promise((resolve, reject) => {
    var csrf = document.querySelector('meta[name="csrf-token"]').content;
    var obj;

    // Set a timeout of 30 seconds (change the value as needed)
    var timeout = 30000;

    var fetchAndResolve = () => {
        fetch("MyUrl", {
            'headers': {
                'accept': '/',
                'accept-language': 'en-US,en;q=0.9',
                'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
                'sec-ch-ua': '"Chromium";v="116", "Not)A;Brand";v="24", "Google       Chrome";v="116"',
                'sec-ch-ua-mobile': '?0',
                'sec-ch-ua-platform': '"Windows"',
                'sec-fetch-dest': 'empty',
                'sec-fetch-mode': 'cors',
                'sec-fetch-site': 'same-origin',
                'x-csrf-token': csrf,
                'x-requested-with': 'XMLHttpRequest'
            },
            'referrer': 'MyUrl',
            'referrerPolicy': 'strict-origin-when-cross-origin',
            'body': 'consularid=3&exitid=1&servicetypeid=1&calendarType=2&totalperson=1',
            'method': 'POST',
            'mode': 'cors',
            'credentials': 'include'
        })
        .then(res => res.text())
        .then(data => {
            obj = data;
            resolve(obj);
        })
        .catch(error => {
            reject(error);
        });
    };

    setTimeout(() => {
        reject(new Error("Script execution timed out"));
    }, timeout);

    fetchAndResolve();
});
"""

obj_variable = sb.execute_async_script(script)

希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.