Selenium WebDriverWait无法正常工作?

时间:2015-07-30 12:16:12

标签: python html selenium selenium-webdriver freeze

我正在尝试使用Selenium查看一个网页上的几个页面 - PhantomJS()。 问题是它开始冻结,我无法弄清楚原因。这可能与Timeout有关。

这是类的__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()

但是我无法意识到因为它没有引发任何异常。

你能给我一个建议吗?

1 个答案:

答案 0 :(得分:0)

我对硒在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')

因此,这应该返回您使用css选择器搜索的对象的selenium webdriver实例。如果找不到元素本身则会抛出错误。

如果上面的代码运行,则重新运行上面的代码并进行以下修改: -

 >>> 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()是否确实存在问题。如果有任何错误,您可以逐个运行它来指出它。希望这会有所帮助...