Как я могу нажать на кнопку «Сохранить изображение» в TradingView? (Python) - PullRequest
0 голосов
/ 01 ноября 2019

Я пытаюсь создать бота на Python, который выполняет следующие 7 шагов:

  1. Вход в мой аккаунт TradingView

  2. Один разв, поиск определенной торговой пары / индекса и т. д.

  3. После отображения интересующей пары необходимо перейти в раздел «подробный график»

  4. Затем необходимо сделать снимок / снимок экрана с отображаемой диаграммой. Это можно сделать в TradingView с помощью «Alt + s»

  5. Отображается диалоговое окно, содержащее 3 очень важных элемента: URL-адрес снимка экрана, справа от этого URL-адреса a "Кнопка «Скопировать URL» и кнопка «Сохранить изображение», которая при нажатии перенаправит вас на новую страницу, содержащую только указанный скриншот.

  6. На этом этапе процесса это необходимощелкните правой кнопкой мыши на изображении, перейдите в «Сохранить как» и появится обычное меню сохранения Windows.

  7. Последний шаг - ввести имя для снятого скриншота и сохранить его наопределенная папка на моем компьютере.

До сих пор я успешно написал код, который завершает шаги 1 - 4, поэтому, когда я достигаю шага 5, я не нашел способаодин из следующих 2:

  • Либо нажмите кнопку «Сохранить изображение», чтобы перейти к oage, отображающему скриншот, либо

  • скопируйте URL и откройте его на другой странице.

Я пробовал оба,но с небольшим успехом. Однажды случилось так, что когда я превратил свой сценарий в блокнот Jupyter, запуск ячейки, которая должна была нажать кнопку «Сохранить изображение», однажды привел к ошибке, но если я запустил ее снова (без изменений), это фактически заставило менястраница, которая отображает снимок экрана.

Я даже скачал X Path Helper для поиска элемента HTML, который мне нужно было передать в мой код, но я обнаружил, что это тоже очень сложно.

X pathпомощник получил следующую информацию:

  • Для кнопки «Сохранить изображение»: html [@ class = 'is-authenticated is-not-pro-not-trial is-trial-available-availableFeature-JS Feature-Flexbox Feature-Canvas Feature-CanteText Feature-No-touchevents Feature-History Feature-Draganddrop Feature-Websockets Feature-Multibgs Feature-Csscolumns Feature-Csstransitions Feature-Localstorage Feature-No-MobileTouch функция сенсорный объект функция-pointerevents тема-light '] / body [@ class =' ​​страница диаграммы недоступна для выбора '] / div [@ id =' overlap-manager-root '] / div / div / div [@ class =' ​​wrap-3axdIL2R - '] / div[@ class = 'container-p3zks2PX -'] / div [@ class = 'modal-GUK9cvUQ -'] / div [@ class = 'modal-C2LSTwhC- dialog-2Ei1ngXh- dialog-2APwxL3O- округлый-tXI9mwGE- shadowed-2M13-xZa - '] / дел [@ класс =' тело-2н-vuwQW - '] / дел [@ класс =' Content-tr28wPlV - '] / дел [@ класс =' форма-2GifjSKe - '] / дел [@class = 'actions-3fKk-h7d -'] / a [@ class = 'link-1alPBTTQ -'] / span [2]

  • Для кнопки «Копировать URL»: /html [@ class = 'is-authenticated is-not-pro-not-trial is-trial-available-feature-js feature-flexbox feature-canvas feature-canvastext feature-no-toucheventsfeature-multiplebgs feature-csscolumns feature-csstransitions feature-localalstorage feature-no-mobiletouch feature-touch feature-pointerevents theme-light '] / body [@ class =' ​​диаграмма-страница недоступна для выбора '] / div [@ id =' overlap-менеджер-корень '] / дел / дел / дел [@ класс =' наматывается 3axdIL2R - '] / дел [@ класс =' контейнер-p3zks2PX - '] / дел [@ класс =' модальной GUK9cvUQ - '] / дел[@ class = 'modal-C2LSTwhC- dialog-2Ei1ngXh- dialog-2APwxL3O- округленный-tXI9mwGE- затененный-2M13-XZA - '] / дел [@ класс =' тело-2н-vuwQW - '] / дел [@ класс =' Content-tr28wPlV - '] / дел [@ класс =' форма-2GifjSKe - '] / дел [@ class = 'copyForm-1HuPoKA0 -'] / div [@ class = 'copyBtn-1oB8tEqo- shadow-2JTdO0Fb -'] / button [@ class = 'button-2O-nMUcz- active-2UxWxOgk- withPadding-_5CJoO5q- ghost3yO24wIn- primary-1rSzOFdX - '] / span [@ class =' ​​text-2KOWx3rB - ']

  • и для текста URL: / html [@ class = 'is-authenticated is-not-pro-not-trial is-trial-available-js feature-flexbox feature-canvas feature-canvastextfeature-no-touchevents feature-history Feature-draganddrop Feature-Websockets Feature-Multibgs Feature-Csscolumns Feature-Csstransitions Feature-Localstorage Feature-No-MobileTouch Feature-Touch Feature-Pointerevents тема-свет '] / тело [@ class =' ​​диаграмма-страница невыбираема '] / div [@ id =' overlap-manager-root '] / div / div / div [@ class =' ​​wrap-3axdIL2R - '] / div [@ class =' ​​container-p3zks2PX - '] /div [@ class = 'modal-GUK9cvUQ -'] / div [@ class = 'modal-C2LSTwhC- dialog-2Ei1ngXh- dialog-2APwxL3O- округлый-tXI9mwGE- shadowed-2M13-xZa -'] / div [@ class = 'тело-2н-vuwQW - '] / дел [@ класс =' Content-tr28wPlV - '] / дел [@ класс =' форма-2GifjSKe - '] / дел [@ класс =' copyForm-1HuPoKA0 - '] / дел [@ class = 'inputWrapper-6bNZbTW4- inputWrapper-6bNZbTW4 -'] / input [@ class = 'textInput-3WRWEmm7 -']

Но я не смог найти, что передать в мойМетод "find_element_by ..." в селеВеб-драйвер nium.

Вот мой код:

import time
import pyautogui                    
import PIL                          

### selenium package tools
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC1
from selenium.webdriver.common.by import By


### PIL image handler
from PIL import Image

##################
### START CODE ###
##################

### We connect to Google Chrome:

```driver = webdriver.Chrome('C:/Users/PC/Desktop/Crypto Trading/chromedriver.exe')```  # change according to loc


### We go into the webpage (TradingView) in this case:

driver.get ("https://www.tradingview.com/#signin")    ### Get into webpage
assert "TradingView" in driver.title
driver.maximize_window()     ### Set window size

### We declare user and password:

user = 'my_username'
pwd = 'myPassword'

### We enter credentials:

selector = driver.find_element_by_name('username')
selector.send_keys(user)
selector = driver.find_element_by_name("password")
selector.send_keys(pwd)
selector.send_keys(Keys.RETURN)     ### Press "Enter"

### We enter the desired chart in the Search Bar:

etherUSD = 'ETHUSD'
bitcoinUSD = 'BTCUSD'
etherBitcoin = 'ETHBTC'
rippleUSD = 'XRPUSDT'
etherXRP = 'XRPETH'

selector = driver.find_element_by_name('query')
selector.send_keys(etherUSD)
selector.send_keys(Keys.RETURN)

### We go to detailed chart:

driver.get('https://www.tradingview.com/chart/?symbol=BITSTAMP:ETHUSD')

### To take a snapshot inside TradingWiew, we need the keyboard shortcur: *Alt + s*

### Press Alt + s
ActionChains(driver).key_down(Keys.ALT).send_keys('s').perform()     ### Alt + s

#wait_time = 25

### Find class
selector = driver.find_element_by_class_name("actions-3fKk-h7d-")

### Go to the link of the picture inside the class
urlImage = selector.find_element_by_css_selector('a').get_attribute('href')

### Open link of page with picture only
driver.get(urlImage)

time.sleep(3)

### In this page, this is the tag name of the picture of interest
### It is a .PNG image
image = driver.find_element_by_tag_name('IMG')

### ActionChains to "right-click" on image
actionChain = ActionChains(driver)
actionChain.context_click(image).perform()
pyautogui.typewrite(['down','down','enter'])

### Enter name and save
pyautogui.typewrite('TVImage_1\n', interval=0.5)```


...