2017-10-17 11 views
1

Je veux trouver tous les hyperliens dans une page Web qui a un lien de téléchargement xml et les télécharger en boucle. Il y a un formulaire qui apparaît lorsque le lien hypertexte est cliqué, et doit être rempli pour continuer le téléchargement. Je suis face à des problèmes dans la visibilité des éléments liés à ces fichiers xml dans la page Web, mais je reçois l'erreur suivante:Python Selenium CSS Selector: L'élément n'est pas visible

"selenium.common.exceptions.ElementNotInteractableException: Message: Element is not visible"

Je suis joint à la présente le code, des suggestions pour corriger ce sera très appréciée.

import os 
import time 
from selenium import webdriver 
from selenium.webdriver.common.keys import Keys 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.webdriver.common.by import By 

fp = webdriver.FirefoxProfile() 

fp.set_preference("browser.download.folderList", 2) 
fp.set_preference("browser.download.manager.showWhenStarting", False) 
fp.set_preference("browser.download.dir", "F:\Projects\Poli_Map\DatG_Py_Dat") 
fp.set_preference("browser.helperApps.neverAsk.saveToDisk", "text/xml") 

driver = webdriver.Firefox(firefox_profile=fp) 

m = 'xml' 
driver.get('https://data.gov.in/catalog/variety-wise-daily-market-prices-data-cauliflower') 
wait = WebDriverWait(driver, 10) 

elem = driver.find_element_by_xpath("//*[@href]") 
elem.send_keys("xml") 
elem.send_keys(Keys.RETURN) 

wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".list-recent-events li"))) 

assert m in driver.page_source 
for link in elem: 
    link.click() 


    class FormPage(object): 
     def fill_form(self, data): 
      driver.execute_script("document.getElementById('edit-download-reasons-non-commercial').click()") 
      driver.execute_script("document.getElementById('edit-reasons-d-rd').click()") 
      driver.find_element_by_xpath('//input[@name = "name_d"]').send_keys(data['name_d']) 
      driver.find_element_by_xpath('//input[@name = "mail_d"]').send_keys(data['mail_d']) 
      return self 

     def submit(self): 
      driver.execute_script("document.getElementById('edit-submit').click()") 


    data = { 
     'name_d': 'xyz', 
     'mail_d': '[email protected]', 
    } 

    time.sleep(3) 
    FormPage().fill_form(data).submit() 

Répondre

0

Vous devez localiser uniquement les hyperliens XML. votre localisateur //*[@href] localise tous les liens HREF. Utiliser ci-dessous le code

#locate all the links which have xml 
allelements = driver.find_elements_by_xpath("//a[text()='xml']") 

# Iterate all links one by one 
for element in allelements: 
    element.click() 
    class FormPage(object): 
     def fill_form(self, data): 
      driver.execute_script("document.getElementById('edit-download-reasons-non-commercial').click()") 
      driver.execute_script("document.getElementById('edit-reasons-d-rd').click()") 
      driver.find_element_by_xpath('//input[@name = "name_d"]').send_keys(data['name_d']) 
      driver.find_element_by_xpath('//input[@name = "mail_d"]').send_keys(data['mail_d']) 
      return self 

     def submit(self): 
      driver.execute_script("document.getElementById('edit-submit').click()") 


    data = { 
     'name_d': 'xyz', 
     'mail_d': '[email protected]', 
    } 
    time.sleep(5) 
    FormPage().fill_form(data).submit() 

    #It opens the download link in new tab So below code again switch back to parent window itself 
    window_before = driver.window_handles[0] 
    driver.switch_to_window(window_before) 
+0

Merci NarendraR pour la réponse. Les exécutions et après le 1er téléchargement je fais face à l'erreur suivante: selenium.common.exceptions.StaleElementReferenceException: Message: La référence d'élément de stale: soit l'élément n'est plus attaché à le DOM ou la page a été rafraîchie – Cashi