硒元素点击不按预期工作

时间:2016-07-09 09:36:23

标签: python selenium web-crawler

我试图编写一个自动脚本,用硒下载一些外汇美元/加元价格历史数据。

提供了这些数据

SecretKey

我想下载的数据选择烛台选项 1小时,手动选择“勾选”按钮并选择“小时”后,这看起来像是:< / p>

https://www.dukascopy.com/swiss/english/marketwatch/historical/

优惠方区域变为可点击。如果我使用selenium自动执行此过程,代码如下所示:

driver = webdriver.Firefox()
driver.get("https://www.dukascopy.com/swiss/english/marketwatch/historical/")

# wait for the frame to load and switch
wait = WebDriverWait(driver, 20)
iframe = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".mainContentBody iframe")))
driver.switch_to.frame(iframe)

for pair in ["USDCAD"]:
    css_selector = "ul > li[data-group][data-instrument='{}/{}']".format(pair[:3], pair[3:])
    li_item = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, css_selector)))
    li_item.click()

    # Set the two options about candlestick
    candle_unit_menu_ele = driver.find_element_by_id(":i")
    candle_unit_menu_ele.click()

    candle_unit_ele = wait.until(EC.visibility_of_element_located((By.ID, ":3"))
    candle_unit_ele.click()

但是,执行此脚本后,您会发现选择了USD / CAD按钮,而蜡烛单位未设置为小时,商品方部分也不可用。图片:

enter image description here

我想知道为什么会发生这种情况以及如何获得预期的结果。

非常感谢!

2 个答案:

答案 0 :(得分:0)

<强> 编辑:

点击正确的元素可能会出现问题。在行之后:

candle_unit_ele = wait.until(EC.visibility_of_element_located((By.ID, ":3")))

添加:

candle_unit_ele = driver.find_element_by_xpath("//*[@id=':3']/div")

...单击ID为:3的div的子div。

所以这两个步骤现在可以是:

# Set the two options about candlestick
candle_unit_menu_ele = driver.find_element_by_id(":i")
candle_unit_menu_ele.click()

candle_unit_ele_parent = wait.until(EC.visibility_of_element_located((By.ID, ":3")))
candle_unit_ele = candle_unit_ele_parent.find_element_by_xpath("//*[@id=':3']/div")
candle_unit_ele.click()

或者:

candle_unit_ele = wait.until(EC.visibility_of_element_located((By.XPATH, "//*[@id=':3']/div")))
candle_unit_ele.click()

顺便说一句,你在这行上有语法错误:

candle_unit_ele = wait.until(EC.visibility_of_element_located((By.ID, ":3"))

需要一个结束括号:

candle_unit_ele = wait.until(EC.visibility_of_element_located((By.ID, ":3")))

此外,虽然不是错误,但由于您实际上没有循环,因此不需要行for pair in ["USDCAD"]:。仅pair = "USDCAD"就足够了,除非您计划循环其他货币选项。但由于它们是单选按钮,因此您最终只能选择循环运行的最后一个按钮。

答案 1 :(得分:0)

我试过这个,它对我有用:

   candle_unit_ele = wait.until(EC.visibility_of_element_located((By.ID, ":3"))
   candle_unit_ele.click()

将上面的代码替换为:

   candle_unit_ele = driver.find_element_by_id(":3")
   candle_unit_ele.click()