2015-09-26 83 views
4

有时,当我使用硒点击页面上的特定链接,点击经历,但网站并没有点击响应。例如,以下是我尝试在nba.com上的统计信息页面上的日期之间导航的情况。硒点击不触发网站(蟒蛇)事件

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as ec 

import datetime 
import time 

def go_to_next_day(driver, next_date): 
    for elem in driver.find_elements_by_css_selector('.date-selector i'): 
     if 'right' in elem.get_attribute('class'): 
      print 'Found next day!' 
      elem.click() 
      break 
    else: 
     raise ValueError('Unable to navigate to the next day') 

    # wait 30 seconds until the next day loads 
    WebDriverWait(driver, 30).until(
     ec.text_to_be_present_in_element((By.CSS_SELECTOR, '.date-selector > span'), next_date.strftime('%m/%d/%Y')) 
    ) 


if __name__ == '__main__': 
    # go to nba.com 
    driver = webdriver.Firefox() 
    driver.set_window_size(2560, 1600) 
    driver.get('http://stats.nba.com/scores/#!/10/03/2014') 

    print 'NBA.com loaded. Clicking to next day!!!' 
    end_date = datetime.datetime.now() 
    current_date = datetime.datetime.strptime('2014-10-03', '%Y-%m-%d') 

    # after page loads, just click right until you get to current date 
    while current_date <= end_date: 
     # do something interesting on the page, modeled as a sleep 
     time.sleep(1) 

     next_date = current_date + datetime.timedelta(days=1) 
     go_to_next_day(driver, next_date) 
     current_date = next_date 
     print 'Went to day {}'.format(current_date) 

    driver.quit() 
    print 'Done' 

为什么脚本总是点击,但网站有时只是改变页面?是否something to do with angular?我怀疑它与操作系统有什么关系,但我在Mac OS X上。

我不确定并且真的很想弄清楚如何避免点击失败,特别是因为我我想点击并以硒的方式等待。

回答

3

的问题是,点击并不会让它去的第二天,如果当天的数据仍在加载。换句话说,如果“加载微调器”是可见的 - 单击>按钮不起作用。

要解决这个问题:等待包含微调div.loader元素的隐蔽性:

def go_to_next_day(driver, next_date): 
    wait = WebDriverWait(driver, 10) 
    actions = ActionChains(driver) 
    try: 
     next_button = wait.until(ec.element_to_be_clickable((By.CSS_SELECTOR, '.date-selector i[class*=right]'))) 
     actions.move_to_element(next_button).click().perform() 
    except TimeoutException: 
     raise ValueError('Unable to navigate to the next day') 

    # THIS IS THE KEY FIX 
    wait.until(ec.invisibility_of_element_located((By.CSS_SELECTOR, "div.loader"))) 

    # wait until the next day loads 
    wait.until(
     ec.text_to_be_present_in_element((By.CSS_SELECTOR, '.date-selector > span'), next_date.strftime('%m/%d/%Y')) 
    ) 

我也跟下一个按钮操作略有不同,随时继续用自己的方法或切换到我的 - 关键的解决方案是在等待“微调”隐形。适用于我。

+0

因此,在这种情况下,有一个元素,我可以直视,以确保页面加载正常。如果没有像div.loader这样的元素会怎么样? 另外什么是使用ActionChains优于点击? –

+0

@AkshayDongaonkar这个问题实际上是网站特定的。我通常会使用这个“窍门”,等待加载过程中出现“加载”图标/微调器等隐形功能。更经常地,我只是等待所需的内容出现 - 明确地等待容器的可见性/存在与期望的数据。 – alecxe

+0

@AkshayDongaonkar在这种情况下,动作链有助于将鼠标悬停在元素上,然后单击 - 有时有助于解决“单击”问题。我很确定你实际上不需要在这里的行动链。 – alecxe