javascript - Selenium 点击不会在网站上触发事件(python)

标签 javascript python angularjs selenium selenium-webdriver

有时,当我使用 selenium 点击页面上的特定链接时,点击会通过,但网站不会响应点击。例如,当我尝试在 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 上。

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

最佳答案

问题是如果当天的数据仍在加载,则单击不会使其转到第二天。换句话说,如果“加载微调器”可见 - 单击 > 按钮无效。

解决方法:WAITINGdiv.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'))
    )

我对下一个按钮的操作也略有不同,请随意继续您自己的方法或切换到我的方法 - 关键修复是等待“微调器”隐形。为我工作。

关于javascript - Selenium 点击不会在网站上触发事件(python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32792939/

相关文章:

javascript - 使用 parse.com 将新数据添加到源时刷新 ng-repeat 行

javascript - 谁能解释为什么这个JavaScript时间函数将特定的一天解释为25小时?

javascript - 事件委托(delegate)如何在 Javascript 内部工作

javascript - 在 Chrome 中的多个元素上使用平滑函数的 scrollIntoView()

python - 有思想的python包导入优先级

angularjs - 在Angular中的ng-click上从所有子项中删除类,除了单击的子项

javascript - 意外的结果将php数组引入javascript

python - 从列表创建字典

python - 解决生成器中的评估时间差异

jquery - 使用jQuery更改angularJS树根节点的CSS样式