Python Selenium CSS 选择器:元素不可见 [英] Python Selenium CSS Selector: Element is not visible

查看:37
本文介绍了Python Selenium CSS 选择器:元素不可见的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在具有 xml 下载链接的网页中找到所有超链接并循环下载它们.单击该超链接时会出现一个表单,需要填写才能继续下载.我在网页中与此 xml 文件相关的元素的可见性方面遇到问题,但收到以下错误:

I want to locate all the hyperlinks in a webpage which has a xml download link and download them in a loop. There is form which arises when the said hyperlink is clicked, and needs to be filled to proceed with the download. I'm facing issues in the visibility of the elements related to this xml files in the webpage, but I receive the following error:

"selenium.common.exceptions.ElementNotInteractableException: 消息:元素不可见"

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

我在此附上了代码,任何纠正此问题的建议将不胜感激.

I've hereby attached the code, any suggestions to rectify this will be much appreciated.

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': 'xyz@outlook.com',
    }

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

推荐答案

您只需定位 XML,而不是所有超链接.您的定位器 //*[@href] 正在定位所有 HREF 链接.使用下面的代码

You have to locate only the XML not all hyper links. your locator //*[@href] is locating all the HREF links. Use below 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': 'xyz@outlook.com',
    }
    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)

这篇关于Python Selenium CSS 选择器:元素不可见的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆