Python Selenium click () не работает для некоторых кнопок - PullRequest
0 голосов
/ 25 мая 2020

Моя цель - автоматизировать загрузку 1-минутных тиковых данных (csv) из Fidelity.

Проблема в том, что веб-драйвер не открывает раскрывающийся список, в котором отображаются различные варианты интервалов.

Я определил, что кнопка не нажимается, так как, как написано ниже, код python печатает только оператор 'ElementNotInteractableException', и я не вижу раскрывающегося списка, когда код запущен.

То, что я пробовал до сих пор, - это как xpath, так и путь селектора для элемента раскрывающейся кнопки с заголовком «DAILY». Я также попытался использовать элементы, окружающие кнопку раскрывающегося списка в коде HTML, например маленький треугольник рядом с «DAILY». Я также пробовал использовать Select, но получил ошибку, поскольку элемент был div.

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

Все предложения приветствуются. Если есть детали кода или html фрагменты, дайте мне знать.

Веб-сайт (для доступа требуется учетная запись Fidelity): https://screener.fidelity.com/ftgw/etf/gotoCL/snapshot/advancedChart.jhtml?symbols=KO

python код:

from selenium import webdriver as webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By as By
import selenium.common.exceptions as exceptions
from selenium.webdriver.support import (
    expected_conditions as EC)
import time

class Scraper:

    def __init__(self):

        self.driver = webdriver.Safari()

    def scrapes(self):

        try:

            self.signIn()
            time.sleep(3)
            self.getCSV('KO')

        except exceptions.TimeoutException:

            print('TimeoutException')

        except exceptions.ElementNotInteractableException:

            print('ElementNotInteractableException')

        self.driver.close()

    def signIn(self):

        driver = self.driver
        driver.get('https://www.fidelity.com/')

        #enter username
        ecTuple = (By.CSS_SELECTOR, 'input#userId-input')
        elPresent = EC.element_to_be_clickable(ecTuple)
        WebDriverWait(driver, 30).until(elPresent).send_keys(
            "USERNAME")

        #enter password
        driver.find_element_by_css_selector(
            'input#password').send_keys("PASSWORD")

        #click login button
        driver.find_element_by_css_selector(
            'button#fs-login-button').click()

    def getCSV(self, tickerStr):

        driver = self.driver
        stockURL = (
            'https://screener.fidelity.com/' +
            'ftgw/etf/gotoCL/snapshot/advancedChart' +
            '.jhtml?symbols=' + tickerStr
            )
        driver.get(stockURL)

        # open intervals dropdown
        drpDnXP = '//*[@id="selected_frequency"]'
        ecTuple = (By.XPATH, drpDnXP)
        elPresent = EC.element_to_be_clickable(ecTuple)
        WebDriverWait(driver, 30).until(elPresent).click()

        # choose one minute intervals
        minute1XP = '//*[@id="frequency_0"]'
        driver.find_element_by_xpath(minute1XP).click()

        print(1)

Scraper().scrapes()

html рассматриваемого элемента раскрывающейся кнопки:

<div id="selected_frequency" class="ng-binding ng-scope">DAILY</div>

Некоторые окружающие html код:

<div class="selected-item-container">
        <div class="selected-item ng-binding">
                <div id="selected_frequency" class="ng-binding ng-scope">DAILY</div>
        </div>
        <span class="triangle"></span>
</div>
...