2025, Nov 01 19:01
Python Selenium में एक क्लिक पर कई टैब खुलने की समस्या का हल
Python 3.11 + Selenium + Chrome में क्लिक पर कई टैब खुलने की समस्या समझें और रोकें: anchor के href पर डायरेक्ट नेविगेशन करें या target हटाकर स्थिर विंडो हैंडलिंग पाएं.
जब आप किसी साइट पर नेविगेशन को ऑटोमेट करते हैं, तो एक क्लिक से अचानक कई टैब खुल जाना सिर्फ खीझ की बात नहीं है। यह विंडो-हैंडल की लॉजिक बिगाड़ देता है, एसेर्शन की क्रमिकता को गड़बड़ा देता है और समय बर्बाद करता है। Python 3.11 + Selenium + Chrome सेटअप में, लिस्टिंग पेज पर एंकर पर क्लिक करने से तीन टैब खुल गए: मूल वाला और दो डुप्लीकेट। उद्देश्य स्पष्ट है: हर इंटरैक्शन पर केवल एक बार पेज बदलना ट्रिगर हो और विंडो मैनेजमेंट स्थिर रहे।
समस्या को दोहराना
नीचे दिया गया स्निपेट लक्ष्य पेज खोलता है, एक एलिमेंट पर क्लिक करता है और तीन विंडो का इंतज़ार करता है। नतीजा वही समस्या है: क्लिक से दोहराए गए टैब बनते हैं, और आगे चलकर HTML तथा विंडो फोकस संभालना उलझ जाता है।
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Options
opts = Options()
opts.add_argument("--headless")
browser = webdriver.Chrome() # विकल्प जानबूझकर यहाँ पास नहीं किए गए हैं
browser.get("https://upn.ru/kupit/kvartiry")
page_heading = browser.title
print(page_heading)
pause = WebDriverWait(browser, 5)
base_window = browser.current_window_handle
assert len(browser.window_handles) == 1
_ = browser.find_element(By.CLASS_NAME, 'main-container-margins.width-100').click()
pause.until(EC.number_of_windows_to_be(3))
for handle in browser.window_handles:
if handle != base_window:
browser.switch_to.window(handle)
break
page_heading = browser.title
print(page_heading)
वास्तव में क्या हो रहा है
पेज इंटरैक्शन पर दो बार प्रतिक्रिया देता है। पहले, एंकर का सामान्य व्यवहार चलता है और Chrome एक नया टैब खोलता है। फिर उसी एलिमेंट से जुड़ा JavaScript लिस्नर window.open() कॉल करता है, जिससे दूसरा कॉपी बन जाती है। WebDriver सिर्फ ब्राउज़र को चलाता है; अगर पेज खुद दो बार खुलने का निर्देश देता है, तो आपको दो नए टैब दिखेंगे।
आगे बढ़ने के दो सुरक्षित तरीके
विश्वसनीय उपाय यह है कि डुप्लीकेट व्यवहार ट्रिगर ही न हो। या तो बिना क्लिक किए सीधे URL पर जाएं, या अतिरिक्त हैंडलर को निष्क्रिय कर के एक बार क्लिक करें।
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
cfg = webdriver.ChromeOptions()
cfg.add_argument('--headless')
drv = webdriver.Chrome(options=cfg)
drv.get('https://upn.ru/kupit/kvartiry')
waiter = WebDriverWait(drv, 5)
anchor = waiter.until(EC.element_to_be_clickable(
(By.CSS_SELECTOR, 'a.card-title') # अपने लक्ष्य के अनुसार इस सेलेक्टर को समायोजित करें
))
# तरीका 1: क्लिक छोड़ें और गंतव्य को सीधे खोलें
href_value = anchor.get_attribute('href')
drv.get(href_value)
# --- वैकल्पिक रूप से, यदि आप सचमुच 'क्लिक' करना चाहते हैं ---
# drv.execute_script(
# "arguments[0].removeAttribute('target'); arguments[0].click();", anchor)
# waiter.until(EC.number_of_windows_to_be(2))
पहले तरीके में आप href निकालते हैं और सीधे उसी पर नेविगेट करते हैं। कोई अनचाहा नया टैब नहीं बनता, और ब्राउज़र एक ही विंडो में रहता है। दूसरे तरीके में आप क्लिक तो करते हैं, लेकिन target एट्रिब्यूट हटा देते हैं और ठीक दो विंडो का इंतज़ार करते हैं, जिससे टैब की संख्या पूर्वानुमेय रहती है।
यह क्यों मायने रखता है
मजबूत ऑटोमेशन के लिए स्थिर विंडो मैनेजमेंट जरूरी है। जब हर इंटरैक्शन तय रूप से एक ही पेज बदलने का परिणाम देता है, तो हैंडल स्विचिंग, एसेर्शन और DOM क्वेरी एकसमान रहती हैं। आकस्मिक डुप्लीकेट हटाने से टेस्ट-फ्लो भटकता नहीं और कोड सरल बना रहता है।
व्यावहारिक नोट्स
सेलेक्टर की शुद्धता महत्वपूर्ण है। सही CSS सेलेक्टर से उपयुक्त एलिमेंट पकड़ लेने के बाद href द्वारा सीधा नेविगेशन साफ़-सुथरे ढंग से काम करता है। अगर सेलेक्टर गलत हुआ, तो आपको ऐसे संदेश मिल सकते हैं: InvalidArgumentException: 'url' must be a string. सही लिंक निकालकर उसका href driver.get को देने से यह समस्या नहीं आती।
समापन
डुप्लीकेट टैब आमतौर पर पेज द्वारा एक साथ दो नेविगेशन पाथ ट्रिगर करने का नतीजा होते हैं। मूल कारण पर वार करें: या तो क्लिक किए बिना href के जरिए जाएं, या क्लिक से पहले अतिरिक्त हैंडलर को निष्क्रिय करें। प्रवाह को एक तयशुदा पेज-ओपन तक सीमित रखें, और आपकी विंडो-हैंडल लॉजिक सुसंगत और समझने में आसान रहेगी।