2014-06-06 16 views
5

Sto usando selenium-python con PhantomJS. Il codice è più o meno così:PhantomJS in modo casuale non esce (usando Selenium con Python)

from selenium.webdriver import PhantomJS 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions 
driver = PhantomJS() 
wait = WebDriverWait(driver, 10) 
driver.get(url) 
while True: 
    // scrap the page 
    try: 
     driver.find_elements_by_css_selector('.next')[0].click() 
    except: break 
    wait.until(expected_conditions.visibility_of_element_located((By.CSS_SELECTOR, '.loading'))) 
    wait.until(expected_conditions.invisibility_of_element_located((By.CSS_SELECTOR, '.loading'))) 
driver.quit() 

Uso un task di sedici che esegue periodicamente questo codice. Il problema è che di tanto in tanto ci sono alcuni processi phantomjs stantii. Quando analizzo i log di sedici, l'attività viene completata correttamente senza errori, ma il processo phantomjs è ancora in esecuzione.

qualche informazione in più:

  • sto usando Python 3.2
  • sto usando Sedano 3.1 con battito
  • sto usando Debian Wheezy
  • PhamtomJS ho compilato dai sorgenti e ha creato un collegamento simbolico come questo: ln -s /opt/phantomjs/bin/phantomjs /usr/local/bin/

Qualcuno può suggerire un modo per eseguire il debug e scoprire chi è la colpa è questo?

+0

È possibile sostituire PhantomJS con il browser preferito e posizionarlo su un display virtuale su Linux con xvfbwrapper. Se quei processi persistono potrebbe essere un problema di selenio. – barrios

+0

Questa sarebbe l'ultima soluzione per passare a un altro browser (ad esempio Firefox o Chromium con XVFB). C'è un altro modo per eseguire il debug e scoprire chi è la colpa è questo? – Ali

+0

Come probabilmente leggete, la compilazione di phantomjs non è consigliata se i binari corrispondono alle vostre esigenze. Che ne dici di installarlo dai repository debian o usare i file precompilati? – barrios

risposta

2

Non ho mai usato il sedano, sei sicuro che il sedano visualizzerà tutti i messaggi di errore? Per il tuo codice, penso che se si verifica un'eccezione durante l'esecuzione di wait.until(...), driver.quit() non verrà eseguito.

+0

Grazie :) Questo è stato uno stupido errore! Il punto è che il sedano stava riprogrammando i compiti, quindi continuava a peggiorare e tutto ciò che vedevo erano alcuni messaggi di 'RetryException'. – Ali

Problemi correlati