Selenium Python Element.click не работает - PullRequest
0 голосов
/ 09 января 2020

Я новичок в Selenium и пытаюсь имитировать действия пользователя c на сайте для загрузки файла CSV.

Кнопка «Получить данные» генерирует ссылку «скачать файл в формате CSV» когда я делаю это вручную, но это не работает с автоматизацией.

Я получаю исключение, сообщающее, что ссылка не найдена.

Вот что я пробовал:

  • Добавление явных ожиданий, чтобы у страницы было достаточно времени для загрузки. Не сработало.

  • Добавление явных ожиданий между кликом по get_data и до нажатия на ссылку для скачивания. Не сработало.

  • Пробовал разные способы нажатия кнопки "получить данные" ie

     i) get element by xpath and then click.
    
     ii) driver.wait_until(....    driver.find_element.. and not(@disabled). to make sure the button is    not disabled. didn't work    
     iii) Added asserts to make sure the    button is displayed and enabled.
    

** Здесь это аномалия, которую я не понимаю. Я просмотрел файл html, чтобы понять, как он работает, и есть javascript, который проверяет входные данные. Поэтому я думаю, что «get_data» не будет работать, если введенные данные неверны.

Поэтому я попытался отобразить текст после ввода символа «SBIN» с помощью sendkeys с помощью

print (driver.find_element_by_id ("символ"). текст)

, и это печатает пустой. Не уверен, что это проблема.

Был бы очень признателен за решение, так как это сэкономило бы мне массу ручного труда при получении данных о запасах.

Вот видео с изменениями, предложенными KunduK youtube.com/watch?v=hBjjfPIeSCQ&feature=youtu.be

Вот этот сайт. https://www1.nseindia.com/products/content/equities/equities/eq_security.htm

Вот скрипт python для веб-драйвера.

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException
import unittest, time, re

class Test1(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Firefox()
        self.driver.implicitly_wait(30)
        self.verificationErrors = []
        self.accept_next_alert = True

    def test_1(self):
        driver = self.driver
        driver.get("https://www1.nseindia.com/products/content/equities/equities/eq_security.htm")
        driver.find_element_by_id("dataType").click()
        driver.find_element_by_xpath("(.//*[normalize-space(text()) and normalize-space(.)='Get historical data for:'])[1]/following::option[3]").click()
        driver.find_element_by_id("symbol").click()
        driver.find_element_by_id("symbol").clear()
        driver.find_element_by_id("symbol").send_keys("SBIN")
        driver.find_element_by_id("series").click()
        Select(driver.find_element_by_id("series")).select_by_visible_text("EQ")
        driver.find_element_by_xpath("(.//*[normalize-space(text()) and normalize-space(.)='Select series :'])[1]/following::option[15]").click()
        Select(driver.find_element_by_id("dateRange")).select_by_visible_text("24 Months")
        driver.find_element_by_xpath("(.//*[normalize-space(text()) and normalize-space(.)='For past:'])[1]/following::option[8]").click()
        driver.find_element_by_id("get").click()
        driver.find_element_by_link_text("Download file in csv format").click()

    def is_element_present(self, how, what):
        try: self.driver.find_element(by=how, value=what)
        except NoSuchElementException as e: return False
        return True

    def is_alert_present(self):
        try: self.driver.switch_to_alert()
        except NoAlertPresentException as e: return False
        return True

    def close_alert_and_get_its_text(self):
        try:
            alert = self.driver.switch_to_alert()
            alert_text = alert.text
            if self.accept_next_alert:
                alert.accept()
            else:
                alert.dismiss()
            return alert_text
        finally: self.accept_next_alert = True

    def tearDown(self):
        self.driver.quit()
        self.assertEqual([], self.verificationErrors)

if __name__ == "__main__":
    unittest.main()

Ответы [ 2 ]

0 голосов
/ 09 января 2020

Индуцируйте WebDriverWait () и element_to_be_clickable () и следуйте xpath, чтобы щелкнуть ссылку файла CSV.

во-вторых, чтобы получить значение из элемента ввода, вы должны использовать element.get_attribute('value')

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.select import Select

driver = webdriver.Chrome()
driver.get("https://www1.nseindia.com/products/content/equities/equities/eq_security.htm")
driver.find_element_by_id("dataType").click()
driver.find_element_by_xpath(
    "(.//*[normalize-space(text()) and normalize-space(.)='Get historical data for:'])[1]/following::option[3]").click()
driver.find_element_by_id("symbol").click()
driver.find_element_by_id("symbol").clear()
driver.find_element_by_id("symbol").send_keys("SBIN")
# To get the value from input text
print(WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'input#symbol'))).get_attribute(
    'value'))
driver.find_element_by_id("series").click()
Select(driver.find_element_by_id("series")).select_by_visible_text("EQ")
driver.find_element_by_xpath(
    "(.//*[normalize-space(text()) and normalize-space(.)='Select series :'])[1]/following::option[15]").click()
Select(driver.find_element_by_id("dateRange")).select_by_visible_text("24 Months")
driver.find_element_by_xpath(
    "(.//*[normalize-space(text()) and normalize-space(.)='For past:'])[1]/following::option[8]").click()
# driver.find_element_by_id("get").click()    

WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "get"))).click()
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//a[text()='Download file in csv format']"))).click()
0 голосов
/ 09 января 2020

Попробуйте изменить эту строку:

driver.find_element_by_link_text("Download file in csv format").click()

на код ниже:

Подождите, чтобы элемент стал активным.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(driver, 10)  //Explicit Waits to wait for ExpectedCondition
wait.until(EC.element_to_be_clickable((By.LINK_TEXT, 'Download file in csv format'))).click()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...