2015-10-29 3 views
2

Я пытаюсь нажать кнопку, загружающую файл csv. Я могу найти его, но я не могу нажать на него.Способность находить элемент, но не может на него нажимать

url = "http://www.basketball-reference.com/players/a/acyqu01/gamelog/2015/" 
driver = webdriver.Firefox() 
driver.get(url) 
elem = driver.find_element_by_xpath(".//*[@id='advanced_div']/div[2]/div/span[6]") 
elem.click() 

ElementNotVisibleException: Message: Element is not currently visible and so may not be interacted with

Я также попытался это:

action_chain = webdriver.ActionChains(self.driver) 
action_chain.click(elem) 
action_chain.perform() 

Я заметил, исходный код имеет прозрачный шрифт. Означает ли это, что это скрыто? Я прочитал кое-что о выполнении java-скрипта, чтобы щелкнуть по нему. Но я понятия не имею, как это сделать.

+0

Я изменил ответ - не нужно js, задайте профиль профиля ff, чтобы сохранить csv автоматически hehe! – SIslam

ответ

0

Попробуйте реализовать wait, тогда как dom loading - ниже полный рабочий код для меня. Он автоматически устанавливает светлячок профилирование избегает файла CSV сохранить строку и сохраняет файл CSV в определенную папку, в данном случае эта папка является Desktop\downloads

import time 
from selenium import webdriver 
from selenium.webdriver.support.ui import WebDriverWait # available since 2.4.0 
from selenium.webdriver.support import expected_conditions as EC# available since 2.26.0 
from selenium.webdriver.common.by import By 


profile = webdriver.FirefoxProfile() 
profile.set_preference("browser.download.folderList", 2) 
profile.set_preference("browser.download.manager.showWhenStarting", False) 
profile.set_preference("browser.download.dir", r"C:\Users\USER_NAME\Desktop\downloads") 
profile.set_preference("browser.helperApps.neverAsk.saveToDisk", "text/csv") 


url = "http://www.basketball-reference.com/players/a/acyqu01/gamelog/2015/" 

driver = webdriver.Firefox(firefox_profile=profile) 
driver.get(url) 
WebDriverWait(driver,1000).until(EC.presence_of_all_elements_located((By.XPATH,"//*[@id='basic_div']"))) 
elem = driver.find_element_by_xpath("//*[@id='basic_div']/div[2]/div/span[6]") 
elem.click() 
time.sleep(2) 
driver.quit() 
+0

Тот же вывод ошибки –

0

Это делает его

elem = driver.find_element_by_xpath(".//*[@id='basic_div']/div[2]/div/span[6]") 
driver.execute_script('arguments[0].click();',elem) 
+0

Это может выполнить задачу, но это не то, как пользователь будет это делать. Это использует JavaScript, чтобы обойти невидимость элемента. Взгляните на мой ответ. – JeffC

1

Проблема заключается в том, что в DIV которое содержит id=advanced_div. Вы можете увидеть HTML для этого тега ниже, обратите внимание на стиль display:none.

<div id="advanced_div" style="display: none;"> 

Хотя глядя на страницу, я заметил, что есть «Переключить на Advanced Game Log» ссылка на страницу, и я нажал ее. Когда я это сделал, стало видно, что DIV стало видимым, что означало, что теперь отображается ссылка CSV, которую вы хотите.

Чтобы сделать это с кодом, вам нужно нажать на ту же ссылку, а затем нажать на ссылку CSV, которую вы хотите. Вы можете использовать XPath, который у вас есть в вашем коде ... или ... вы можете использовать find_element_by_link_text(), который, я думаю, упрощает эту задачу. Код ниже должен работать.

url = "http://www.basketball-reference.com/players/a/acyqu01/gamelog/2015/" 
driver = webdriver.Firefox() 
driver.get(url) 
driver.find_element_by_link_text("Switch to Advanced Game Log").click() 
driver.find_element_by_link_text("CSV").click() 

Мое единственное беспокойство заключается в том, что текст ссылки CSV может быть не уникальным. Если это так, вы можете использовать свой XPath, как показано ниже.

driver.find_element_by_link_text("Switch to Advanced Game Log").click() 
driver.find_element_by_xpath(".//*[@id='advanced_div']/div[2]/div/span[6]").click() 

В общем, то, что вы хотите делать, когда вы пишете автоматизации, чтобы выяснить, что нужно сделать пользователю на странице, а затем написать код, который делает то же самое. Таким образом, когда вы сталкиваетесь с каким-то элементом, который скрыт, как в этом случае, выясните, как пользователь сделает его видимым, а затем сделает это с помощью кода.

Смежные вопросы