2014-12-28 7 views
6

को तत्काल करने में विफल रहा है, मैं स्केलेर के साथ सेलेनियम/फैंटोमज का उपयोग करने की कोशिश कर रहा हूं और मैं त्रुटियों के साथ झुका हुआ हूं। उदाहरण के लिए, निम्नलिखित कोड का टुकड़ा ले:सेलेनियम के साथ स्केपर, वेबड्राइवर

def parse(self, resposne): 

    while True: 
     try: 
      driver = webdriver.PhantomJS() 
      # do some stuff 
      driver.quit() 
      break 
     except (WebDriverException, TimeoutException): 
      try: 
       driver.quit() 
      except UnboundLocalError: 
       print "Driver failed to instantiate" 
      time.sleep(3) 
      continue 

बार ड्राइवर ऐसा लगता है यह दृष्टांत में नाकाम रही है (ताकि driver, अबाध है इसलिए अपवाद), और मैं blurb (पाने के साथ साथ का एक बहुत मैं में डाल प्रिंट संदेश)

Exception AttributeError: "'Service' object has no attribute 'process'" in <bound method Service.__del__ of <selenium.webdriver.phantomjs.service.Service object at 0x7fbb28dc17d0>> ignored 

चारों ओर Googling, यह सभी phantomjs, जो मेरे पास है (1.9.8 स्रोत से बनाया) को अद्यतन करने का सुझाव लगता है। क्या किसी को पता चलेगा कि इस समस्या और उचित निदान के कारण और क्या हो सकता है?

+0

क्या सेलेनियम पैकेज संस्करण आप उपयोग कर रहे हैं? – alecxe

+0

@ पीएल' – pad

उत्तर

6

इस व्यवहार का कारण यह है कि फ़ैंटॉमजेएस ड्राइवर का Service class लागू किया गया है।

कॉल self.stop() विधि एक __del__ विधि परिभाषित नहीं है:

def __del__(self): 
    # subprocess.Popen doesn't send signal on __del__; 
    # we have to try to stop the launched process. 
    self.stop() 

और, self.stop() यह गुण है पहुँचने का प्रयास कर सेवा उदाहरण अभी भी जीवित है यह सोचते है:

def stop(self): 
    """ 
    Cleans up the process 
    """ 
    if self._log: 
     self._log.close() 
     self._log = None 
    #If its dead dont worry 
    if self.process is None: 
     return 

    ... 

एक ही सटीक समस्या इस धागे में पूरी तरह वर्णित है:


क्या करना चाहिए चुपचाप जबकि चालक उदाहरण छोड़ने से होने वाली AttributeError अनदेखी करने के लिए है:

try: 
    driver.quit() 
except AttributeError: 
    pass 

समस्या यह revision द्वारा शुरू की गई थी। जिसका अर्थ है कि 2.40.0 में डाउनग्रेडिंग भी मदद करेगा।

+0

से @alecxe v2.44.0 धन्यवाद, मैं यह करूँगा। निदान के लिए कोई विचार? मैंने समवर्ती अनुरोधों की संख्या 1 में बदल दी लेकिन इससे मदद नहीं मिली। मेरा अनुमान था कि बहुत सी प्रक्रियाएं उत्पन्न हो रही हैं जो त्रुटि का कारण बन सकती हैं। – pad

+0

@pad ने 'AttributeError' सहायता को पकड़ लिया था? – alecxe

+0

क्षमा करें मैं उस पर एक घंटे में रिपोर्ट करने में सक्षम हूं (एक और मकड़ी चल रहा है)। हालांकि इस तरह हम इस त्रुटि को गलीचा के नीचे बस भर रहे हैं, ठीक है :)। – pad

2

मुझे यह समस्या थी क्योंकि phantomjs स्क्रिप्ट से उपलब्ध नहीं था (पथ में नहीं था)। आप कंसोल में phantomjs चलाकर इसे देख सकते हैं। pypi पर

+0

मेरी समस्या स्मृति थी। मैंने service.py को एक छोटा पैच बनाया है जो इस भयानक त्रुटि से छुटकारा पाता है। हो सकता है कि जब मैंने इसकी जांच की हो तो मैं एक पुल अनुरोध कर सकता हूं। Contd .. – pad

+0

निष्पादन योग्य कोई समस्या नहीं है क्योंकि 'fantomjs' डिफ़ॉल्ट रूप से' __init__' द्वारा उपयोग किया जाता है और यह मेरे सिस्टम पर समान होता है। हम दोनों एक ही त्रुटि देख रहे हैं क्योंकि जब 'self.stop() 'कहा जाता है लेकिन समाप्त करने के लिए कोई' self.process' नहीं है। तो दोनों मामलों में, कुछ गलत हो गया -> प्रक्रिया परिभाषित नहीं की गई है, विशेषता त्रुटि फेंक दें। – pad

0

सेलेनियम संस्करण 2.44.0 के selenium.webdriver.common.phantomjs.service

self.process = None 

मैं एक पैच जमा करने की सोच रहा था Service.__init__ में निम्नलिखित पैच की जरूरत है, लेकिन यह पहले से ही गूगल कोड पर most recent version में मौजूद है।

संबंधित मुद्दे