2016-07-09 2 views
0

Я пытался написать автоматический сценарий для загрузки некоторых исторических данных о ценах USD/CAD в иностранной валюте с селеном. Эти данные доступны наэлемент selenium щелчок не работает как ожидалось

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

данные, которые я хочу, чтобы загрузить выбрать свечные варианты с 1 час, после выбора кнопки «Tick» вручную и выберите «Час», это выглядит следующим образом:

enter image description here

И предложение сторона область становится активной. Если я автоматизирован этот процесс с селеном, кода выглядеть следующим образом:

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

Я задаюсь вопросом, почему это происходит и как иметь ожидаемый результат.

Большое спасибо!

+0

что делает блок установлен? –

+0

Должен быть установлен в час @YuZhang –

+0

Какая версия Selenium и Firefox включена? Я нахожусь на Firefox 45.2 и Selenium 2.52. Когда я запускал ваш код, он работает. – aneroid

ответ

0

Edit:

Там может быть проблема с его нажав правильный элемент. Таким образом, после строки:

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

Добавить:

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

... щелкать ребенка DIV в DIV с идентификатором :3.

Так эти два шага теперь могут быть:

# 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() 

Btw, вы получите синтаксическую ошибку на линии:

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" достаточно, если вы не планируете перебирать другие варианты валюты. Но поскольку они являются радиокнопками, вы должны в конечном итоге выбрать последний цикл.

+0

Хорошо, я попытался перейти на более низкую версию Firefox, но это не сработало. Затем я попробовал переключиться на Chrome, он сработал –

+0

Изменен мой ответ, чтобы щелкнуть другой элемент. См. Редактирование. – aneroid

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() 
Смежные вопросы