2015-07-30 4 views
1

Я пытаюсь посмотреть несколько страниц на одном веб-сайте с Selenium - PhantomJS(). Проблема в том, что она замерзала, и я не могу понять, почему. Вероятно, это что-то с тайм-аутом.Selenium WebDriverWait не работает должным образом?

Это __init__ метод класса.

self.driver = webdriver.PhantomJS(service_args=["--load-images=false"]) 
self.wait = WebDriverWait(self.driver, 2) 

А вот метод:

def click_next_page(self): 
     log('click_next_page : '+self.driver.current_url) # THIS LINE RUNS 
     rep = 0 
     while 1: 
      try: 
       self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'li.arr-rgt.active a'))) # IT MAY FREEZE HERE 
       self.driver.find_element_by_css_selector('li.arr-rgt.active a').click()# IT MAY FREEZE HERE 

       print 'NEXT' # DOESNT PRINT ANY TEXT SO THIS LINE NOT EXECUTED 
       log('NEXT PAGE') 
       return True 

      except Exception as e: 
       log('click next page EXCEPTION') # DONT HAVE THIS TEXT IN MY LOG SO IT DOES NOT RAISES ANY EXCEPTION 
       self.driver.save_screenshot('click_next_page_exception.png') 
       self.driver.back() 
       self.driver.forward() 
       rep += 1 
       log('REPEAT '+str(rep)) 
       if rep>4: 
        break 
       sleep(4) 

     return False 

Проблема заключается в том, что она не вызывает каких-либо исключений или любое сообщение. Линия log('click_next_page : '+self.driver.current_url) работает, а затем она зависает, я ее знаю, потому что у меня есть click_next_page : http://.... в моем журнале как последняя строка.

Проблема, безусловно, где-то здесь:

self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'li.arr-rgt.active a'))) 
self.driver.find_element_by_css_selector('li.arr-rgt.active a').click() 

Но я не могу понять, где, потому что это не вызывает каких-либо исключений.

Не могли бы вы дать мне совет?

ответ

0

Я не имею ни малейшего представления о том, как работает Selenium в PhantomJS. Но я не вижу никаких проблем в вашем коде. Чтобы помочь вам узнать точную проблему, я предлагаю вам отладить ее в небольших кусках и использовать одну строку за раз в консоли (не запустив файл python).

Так проверьте с этим: -

>>> from selenium import webdriver 
>>> driver = webdriver.PhantomJS(service_args=["--load-images=false"]) 
>>> wait = WebDriverWait(driver, 2) 
>>> code for clicking next page 
>>> time.sleep(5) 
>>> driver.find_element_by_css_selector('li.arr-rgt.active a') 

Таким образом, это должно вернуть вам селен WebDriver экземпляра для объекта, которое вы ищете с помощью селектора CSS. Если, сам элемент не найден, он будет вызывать ошибку.

Если приведенный выше код прогонов затем повторно запустить приведенный выше код со следующими изменениями: -

>>> from selenium import webdriver 
>>> driver = webdriver.PhantomJS(service_args=["--load-images=false"]) 
>>> wait = WebDriverWait(driver, 2) 
>>> code for clicking next page 
>>> wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'li.arr-rgt.active a'))) 
>>> driver.find_element_by_css_selector('li.arr-rgt.active a').click() 

Здесь вы сможете проверить, есть ли на самом деле проблема с wait_until(). Если есть какая-либо ошибка, вы можете указать ее, запустив ее один за другим. Надеюсь, это поможет ...

+0

довольно уверен, что вы имеете в виду time.sleep (5), а не time.slee (5) – patricmj

+0

Да ... это time.sleep() ... Извините за типографию ... –

Смежные вопросы