2025, Oct 19 20:31

Python में @timeout के साथ WebDriverWait: अनंत नहीं, बड़ा timeout

जानें क्यों Selenium WebDriverWait अनंत नहीं हो सकता और @timeout के साथ Python में sys.maxsize देकर बड़ा timeout कैसे सेट करें, ताकि टाइमआउट नियंत्रण केंद्रित रहे

जब किसी Python फ़ंक्शन को @timeout() से लपेटा जाता है, तो उस फ़ंक्शन के भीतर Selenium का WebDriverWait जोड़ना अक्सर अतिरिक्त लगता है। डेकोरेटर पहले ही समग्र समय-सीमा लागू करता है, तो स्वाभाविक सवाल उठता है: क्या WebDriverWait को बिल्कुल बिना टाइमआउट के कॉन्फ़िगर किया जा सकता है?

समस्या की रूपरेखा

मान लीजिए एक फ़ंक्शन है जिस पर ऊपरी-स्तर की समय-सीमा लागू है, फिर भी वह WebDriverWait का उपयोग करता है। अंदर का इंतजार डेकोरेटर के टाइमआउट से पहले ही समाप्त हो सकता है, जिससे टाइमआउट नियंत्रण को केंद्रीकृत करने का मकसद विफल हो जाता है।

from selenium.webdriver.support.wait import WebDriverWait
@timeout()
def run_task(client):
    inner_wait = WebDriverWait(client, timeout=10)
    return inner_wait

असल में क्या हो रहा है और क्यों

WebDriverWait को एक स्पष्ट समय-सीमा चाहिए होती है। सच में “कभी न खत्म होने वाला” इंतजार समर्थित नहीं है। अगर उद्देश्य यह है कि WebDriverWait के भीतर समय-पूर्व समाप्ति न हो, क्योंकि कुल मिलाकर फ़ंक्शन-स्तरीय टाइमआउट ही सीमा तय कर रहा है, तो सबसे व्यावहारिक तरीका है एक बेहद बड़ा टाइमआउट मान देना, ताकि व्यवहार में WebDriverWait अपने आप टाइमआउट न हो।

समाधान

उपाय यह है कि अत्यधिक बड़ा टाइमआउट मान पास किया जाए। sys.maxsize का उपयोग करना एक सीधा तरीका है, जिससे WebDriverWait ऐसा व्यवहार करे मानो कोई टाइमआउट है ही नहीं, और साथ ही API की अपेक्षा भी पूरी हो जाए।

import sys
from selenium.webdriver.support.wait import WebDriverWait
@timeout()
def execute_job(driver_ref):
    long_wait = WebDriverWait(driver_ref, timeout=sys.maxsize)
    return long_wait

यह क्यों मायने रखता है

टाइमआउट नीति को सुसंगत रखना अप्रत्याशित व्यवहार से बचाता है। यदि फ़ंक्शन-स्तर का @timeout() नियंत्रण में है, तो WebDriverWait का पहले ही समाप्त हो जाना उलझन भरी विफलताओं का कारण बन सकता है। एक ही, उच्च-स्तरीय टाइमआउट लागू रखने से प्रवाह स्पष्ट रहता है और डीबगिंग के दौरान बाधाएँ कम होती हैं।

मुख्य बातें

WebDriverWait को हमेशा किसी न किसी समय-सीमा की आवश्यकता होती है; यह अनंत समय तक प्रतीक्षा नहीं कर सकता। यदि निष्पादन समय का नियंत्रण @timeout() (फ़ंक्शन-स्तर) कर रहा है, तो WebDriverWait के लिए sys.maxsize जैसे बहुत बड़े मान का उपयोग करें, ताकि वह स्वतंत्र रूप से टाइमआउट न हो। इससे प्रतीक्षा रणनीति एकल नियंत्रण-बिंदु के अनुरूप रहती है और टकराती सीमाओं से बचाव होता है।

यह लेख StackOverflow के एक प्रश्न (लेखक: Geoff Alexander) और Corey Goldberg के उत्तर पर आधारित है।