我试图编写一个自动脚本,用硒下载一些外汇美元/加元价格历史数据。
提供了这些数据我想下载的数据选择烛台选项 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按钮,而蜡烛单位未设置为小时,商品方部分也不可用。图片:
我想知道为什么会发生这种情况以及如何获得预期的结果。
非常感谢!
答案 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()