enter image description here

मेरे पास एक वेबसाइट से मूल्यों को स्क्रैप करने के लिए एक स्क्रिप्ट है, जिसमें एक ड्रॉप-डाउन होवर मेनू है जिसमें मूल मेनू को होवर करने की आवश्यकता होती है और एक ड्रॉप-डाउन विकल्प चुना जाता है। यह कुछ दिन पहले तक पूरी तरह से काम कर रहा था। लेकिन अब बेतरतीब ढंग से विफल हो रहा है।

यह मेरा वर्तमान कोड है:

def select_dropdown():

    WebDriverWait(driver, 10).until(ec.visibility_of_element_located(
        (By.CSS_SELECTOR, "div.menu.menuTopCenter > ul > li:nth-child(3) > a")))
    investment = WebDriverWait(driver, 10).until(ec.element_to_be_clickable(
        (By.CSS_SELECTOR, "div.menu.menuTopCenter > ul > li:nth-child(3) > a")))
    actions.move_to_element(investment).perform()
    WebDriverWait(driver, 10).until(
         ec.element_to_be_clickable((By.CSS_SELECTOR, "li:nth-child(3) > div > div:nth-child(1) > a"))).click()

पैरेंट मेनू के लिए नीचे दिया गया HTML देखें:

 <a class="menuLink mainMenuItem" href="#" renderstyle="NONE" action="" 
 controller="" clientmodulesubid="0" renderlocation="" 
 clearcontentheader="False" 
 lobsystemuserids="Ls6EVzOdmMPVcdHshYcUbg==">Investment</a>

चुने जाने वाले विकल्प के लिए नीचे दिया गया HTML देखें (sub_menu):

 <a class="menuLink mainMenuItem" href="#" renderstyle="REPLACE" action="Index" 
 controller="Portfolio" clientmodulesubid="6109" 
 renderlocation="contentHeaderContainer" clearcontentheader="True" 
 lobsystemuserids="Ls6EVzOdmMPVcdHshYcUbg==">Investment summary</a>

मुझे यह त्रुटि मिलती है:

Traceback (most recent call last):
  File "C:/Users/SChogle/PycharmProjects/Web Scraping All Sites (With BDay).py", line 55, in <module>
    select_dropdown()
  File "C:/Users/SChogle/PycharmProjects/Web Scraping All Sites (With BDay).py", line 29, in select_dropdown
    ec.element_to_be_clickable((By.CSS_SELECTOR, "li:nth-child(3) > div > div:nth-child(1) > a"))).click()
  File "C:\Users\SChogle\AppData\Roaming\Python\Python37\site-packages\selenium\webdriver\support\wait.py", line 80, in until
    raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message: 

यह मूल मेनू और सभी उप-मेनू के लिए पूर्ण HTML है:

 <li class="has-children">
<a class="menuLink mainMenuItem" href="#" 
 renderstyle="NONE" action="" controller="" clientmodulesubid="0" 
 renderlocation="" clearcontentheader="False" 
 lobsystemuserids="8qWAwlpk6Jdje8MVVaH1Tw==">Investment</a>

<div class="subMenu"> 
 <div>

<a class="menuLink mainMenuItem" href="#" renderstyle="REPLACE" 
 action="Index" controller="Portfolio" clientmodulesubid="6109" 
 renderlocation="contentHeaderContainer" clearcontentheader="True" 
 lobsystemuserids="8qWAwlpk6Jdje8MVVaH1Tw==">Investment summary</a>
</div>

<div>
<a class="menuLink mainMenuItem" href="#" renderstyle="REPLACE" 
 action="GetLazyTransactionHistoryByAccountGroup" controller="Transactions" 
 clientmodulesubid="6108" renderlocation="contentHeaderContainer" 
 clearcontentheader="True" 
 lobsystemuserids="8qWAwlpk6Jdje8MVVaH1Tw==">Transaction history</a>
</div>

<div> 
 <a class="menuLink mainMenuItem" href="#" renderstyle="REPLACE" 
 action="LoadIncomeDistribution" controller="IncomeDistribution" 
 clientmodulesubid="7005" renderlocation="contentHeaderContainer" 
 clearcontentheader="True" lobsystemuserids="8qWAwlpk6Jdje8MVVaH1Tw==">Income 
 distribution</a>
</div>

<div>
<a class="menuLink mainMenuItem" href="#" 
 renderstyle="REPLACE" action="PortfolioFees" controller="Fees" 
 clientmodulesubid="6159" renderlocation="contentHeaderContainer" 
 clearcontentheader="True" lobsystemuserids="8qWAwlpk6Jdje8MVVaH1Tw==">Advisor 
 charges</a>
</div>

<div><a class="menuLink mainMenuItem" href="#" 
 renderstyle="REPLACE" action="GetRecurringInstructionsDetail" 
 controller="RecurringInstructions" clientmodulesubid="6158" 
 renderlocation="contentHeaderContainer" clearcontentheader="True" 
 lobsystemuserids="8qWAwlpk6Jdje8MVVaH1Tw==">Recurring instructions</a>
</div> 

<div>
<a class="menuLink mainMenuItem" href="#" renderstyle="REPLACE" 
 action="GenerateAdHocWebStatement_SAIP" controller="AdHocWebStatement" 
 clientmodulesubid="6121" renderlocation="contentHeaderContainer" 
 clearcontentheader="True" lobsystemuserids="8qWAwlpk6Jdje8MVVaH1Tw==">Investor 
 statement</a>
</div>

<div>
<a class="menuLink mainMenuItem" href="#" 
 renderstyle="REPLACE" action="GenerateAdHocWebStatement_SAIP" 
 controller="AdHocWebStatement" clientmodulesubid="8939" 
 renderlocation="contentHeaderContainer" clearcontentheader="True" 
 lobsystemuserids="8qWAwlpk6Jdje8MVVaH1Tw==">Tax certificate</a>
</div>
</div> 
 </li>

मुझे लगता है कि शायद क्या हो रहा है कि स्क्रिप्ट पेज लोड होने से पहले तत्व को खोजने की कोशिश कर रही है, लेकिन मुझे यकीन नहीं है। जैसा कि मैंने कहा कि यह कभी-कभी काम करता है और दूसरी बार विफल रहता है।

0
Saadiq 23 अक्टूबर 2019, 14:07
क्या यूआरएल साझा करना संभव है?
 – 
KunduK
23 अक्टूबर 2019, 14:18
आपको कहां और क्या त्रुटि मिलती है?
 – 
Sers
23 अक्टूबर 2019, 14:25
क्या आपने टाइमआउट बढ़ाने की कोशिश की? क्या आप मेनू और उप मेनू के साथ पूर्ण HTML साझा कर सकते हैं?
 – 
Sers
23 अक्टूबर 2019, 15:22
हाँ, मैंने टाइमआउट को 50 सेकंड तक बढ़ाने की कोशिश की है, फिर भी कोई किस्मत नहीं। मैंने मूल मेनू और उपरोक्त सभी उप-मेनू के साथ पूर्ण HTML शामिल किया है। मुझे बताएं कि क्या आप यही चाहते थे? या आप कुछ और ढूंढ रहे हैं?
 – 
Saadiq
23 अक्टूबर 2019, 15:34

2 जवाब

नीचे दी गई select_menu विधि आजमाएं:

def select_menu(menu: str = None, submenu: str = None):
    menu_locator = f"//div[contains(@class,'menu')]//a[.='{menu}']"
    submenu_locator = f"{menu_locator}/ancestor::li[1]/div[@class='subMenu']//a[.='{submenu}']"

    wait = WebDriverWait(driver, 20)

    wait.until(lambda d: d.execute_script("return document.readyState === 'complete' && jQuery.active === 0;"))

    menu_element = wait.until(EC.element_to_be_clickable((By.XPATH, menu_locator)))
    actions.move_to_element(menu_element).perform()

    wait.until(EC.visibility_of_element_located((By.XPATH, submenu_locator))).click()

कैसे कॉल करें विधि:

select_menu(menu="Investment", submenu="Investment summary")
1
Sers 23 अक्टूबर 2019, 16:26
उत्तर के लिए बहुत बहुत धन्यवाद, लेकिन दुर्भाग्य से अभी भी टाइमआउट त्रुटि हो रही है। किसी कारण से वह मूल मेनू नहीं ढूँढ सकता। मैंने पृष्ठ पर एक बटन क्लिक करने का प्रयास किया है जो पृष्ठ को रीफ्रेश करता है। और फिर मूल मेनू लगभग हमेशा पाया जाता है। हालांकि, "रीफ्रेश" बटन को विश्वसनीय रूप से ढूंढने में एक समस्या है क्योंकि यह एक तत्व को इंटरसेप्टेड त्रुटि पर क्लिक करता है
 – 
Saadiq
23 अक्टूबर 2019, 16:22
मैंने एक चित्र जोड़ा है कि मेनू कैसा दिखता है, यह एक होवर मेनू है। इसलिए "निवेश" पर माउस घुमाने से नीचे दिए गए सभी विकल्प सामने आएंगे
 – 
Saadiq
23 अक्टूबर 2019, 16:25

आप इन चरणों के साथ समाधान को संकीर्ण करने के लिए डिबगिंग का प्रयास कर सकते हैं: 1. ट्राइ कैच का उपयोग करके कोड के समान ब्लॉक को पुनः प्रयास करें:

count=0, max=5;
while(true){    
try{
    //drop down click
    }
    catch(Exception e){
    if(count++==max) throw e;
    }
}
  1. आप पृष्ठ को पुनः लोड करने और फिर इसकी सफलता तक क्रियान्वित करने का प्रयास कर सकते हैं।

    ड्राइवर.नेविगेट ()। ताज़ा करें ();

0
ashwinin 23 अक्टूबर 2019, 18:54