Найти - Пользователи
Полная версия: Python Selenium. Выбор из выпадающего списка
Начало » Python для новичков » Python Selenium. Выбор из выпадающего списка
1
VasiliyS
Здравствуйте, уважаемые форумчане. У меня возникла необходимость в создании скрипта автоматической загрузки файлов с сайта карты расположения метеорных станций.

Возникла большая проблема при работе с выпадающим списком дат. Мне нужен поиск ПО СОДЕРЖИМОМУ, который не работает…

Вот некоторые ресурсы, на которые я опирался:
1. Как выбрать значение выпадающего меню с помощью Selenium с помощью Python
2. Проблемы с select (выпадающий список)
3. Python - как найти элемент из исчезающего раскрывающегося списка с помощью селена
4. Selenium обрабатывает раскрывающийся список

Вот единственный рабочий пример:

 import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://tammojan.github.io/meteormap/')
#Work it!
time.sleep(2)
driver.find_element_by_xpath('/html/body/div[1]/select/option[100]').click()
time.sleep(10)

Заранее спасибо.
xam1816
VasiliyS
карты расположения метеорных станций.
Удивительно,если отдалить карту скопления линий в зоне 51, англии, и еще там скопления в разных местах…
xam1816
VasiliyS
У меня возникла необходимость в создании скрипта автоматической загрузки файлов с сайта карты расположения метеорных станций.
какие данные нужно?Вот эти ссылка на данные
VasiliyS
xam1816

Нет. Конкретно: таблицу под картой.

Моя цель получить:
1. Скриншот карты с метеорами, обнаруженными моей камерой.
2. klm-файлы с 3D расположением траекторий метеоров
3. Как я уже упоминал, csv-файл с данными о метеорах.

Получение пп. 1-3. невозможно без выбора даты из выпадающего списка. С этим не могу разобраться уже неделю. Вот и решил написать на форум.

xam1816
VasiliyS
1. Скриншот карты с метеорами, обнаруженными моей камерой.
2. klm-файлы с 3D расположением траекторий метеоров
3. Как я уже упоминал, csv-файл с данными о метеорах.
вот так у меня выполнились все условия,только нужно отключить подтверждение загрузки
 from selenium import webdriver
import time
driver = webdriver.Firefox()
page = driver.get('https://tammojan.github.io/meteormap/')
element_input = driver.find_element_by_xpath('//*[@id="stationsFilter"]')
element_download_csv = driver.find_element_by_xpath('/html/body/div[4]/button[2]')
element_download_kml = driver.find_element_by_xpath('/html/body/div[4]/button[3]')
element_count_meteors = driver.find_element_by_xpath('//*[@id="rowcount"]')
element_input.send_keys('RU000Q')
while element_count_meteors.text == '0':
	time.sleep(10)
driver.save_screenshot('selenium_screen.png')
element_download_csv.click()
time.sleep(5)
element_download_kml.click()
#time.sleep(30)
#driver.close()

VasiliyS
Мне нужен поиск ПО СОДЕРЖИМОМУ, который не работает…

из выпадающего списка где даты тоже можно выбрать,если добавить
 select = Select(driver.find_element_by_xpath('//*[@id="datasetDropdown"]'))
time.sleep(10)
select.select_by_visible_text("20181223_solrange_271.0-272.0")
VasiliyS
xam1816
nium_
Спасибо большое! Сейчас же все проверю.
VasiliyS
Спасибо большое за помощь! Я проверил работу кода. Добавил еще один элемент: фильтрацию по станции, т.к. загружались не те данные - обнаружения со всей карты.

 #!/usr/bin/python3.8
from selenium import webdriver
from selenium.webdriver.support.select import Select
import time
Station = 'RU000Q'
date = "20211008_solrange_195.0-196.0"
driver = webdriver.Chrome()
page = driver.get('https://tammojan.github.io/meteormap/')
element_station_search = driver.find_element_by_xpath('//*[@id="stationSearch"]')
element_station_filter = driver.find_element_by_xpath('//*[@id="stationsFilter"]')
element_download_csv = driver.find_element_by_xpath('/html/body/div[4]/button[2]')
element_download_kml = driver.find_element_by_xpath('/html/body/div[4]/button[3]')
element_count_meteors = driver.find_element_by_xpath('//*[@id="rowcount"]')
element_station_search.send_keys(Station)
element_station_filter.send_keys(Station)
select = Select(driver.find_element_by_xpath('//*[@id="datasetDropdown"]'))
time.sleep(5)
select.select_by_visible_text(date)
time.sleep(10)
if element_count_meteors.text == '0':
	driver.close()
	
driver.save_screenshot('selenium_screen.png')
element_download_csv.click()
time.sleep(5)
element_download_kml.click()
time.sleep(30)
driver.close()

До этого я написал свой код, который работает через раз:

 #!/usr/bin/python3.8
#WARNING! INSTALL selenium-DRIVER TO YOUR BROWSER!!!
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select
import sys
#ПРИМЕРНО В 17:00 ВСЕ ПЕРЕСТАЛО РАБОТАТЬ ПРОБЛЕМЫ С ПИТОНОМ ИЛИ БРАУЗЕРОМ
#============================================================
#Adjustment script
#ID stantion:
Station = "RU000Q"
#Init web-browser
driver = webdriver.Chrome()
driver.set_window_size(1600, 2048)
#driver.maximize_window()
#etc
Zoom = 7
Date = sys.argv[1]
#Folder for screenshot
fold = "/home/vas/RMS_Processing/" + Station + "_" + Date + "screenie.png"
#============================================================
#Goto link
driver.get('https://tammojan.github.io/meteormap/');
#Waiting
time.sleep(5)
#Select date
driver.find_element_by_xpath("//*[@id='datasetDropdown']/option[contains(text(),'%s')]" %Date).click()
#Find my stantion
driver.find_element(By.XPATH, '//*[@id="stationSearch"]').send_keys(Station)
#Filter my stantion
driver.find_element(By.XPATH, '//*[@id="stationsFilter"]').send_keys(Station)
#Waiting
time.sleep(3)
#Select ZOOM
n=1
while(n<=8-Zoom):
	driver.find_element(By.XPATH, '//*[@id="mapid"]/div[2]/div[1]/div[1]/a[2]').click()
	time.sleep(3)
	n = n + 1
		
#Waiting
time.sleep(15)
if driver.find_element_by_xpath('//*[@id="rowcount"]').text == '0':
	driver.close()
#Screenshot
driver.find_element_by_tag_name('body').screenshot(fold)
#Download *.csv and *.klm - files
driver.find_element(By.XPATH, '//button[text()="Download selection as CSV"]').click()
driver.find_element(By.XPATH, '//button[text()="Download selection as KML"]').click()
#Waiting
time.sleep(5)
#Close browser
driver.quit()

Его проблема - выдает данные неправильной даты. К примеру, я ввожу 8-е октября, а он отображает за 14-е.

Тестируя ваш код и свой, я пришел к выводу что проблема в конструкции:

 #Select date
driver.find_element_by_xpath("//*[@id='datasetDropdown']/option[contains(text(),'%s')]" %Date).click()

Это решение я использовал, т.к. селениум находит по выделенному тексту ВСЮ область, а не ее часть. А именно:

Мне нужно, чтобы поиск производился по дате:

 date = "20211008"

А не по содержимому в списке:

 date = "20211008_solrange_195.0-196.0"

Т.к. я не знаю каким образом считать числа в “_solrange_195.0-196.0”. Логичнее осуществить поиск по элементу.

Отсюда главный вопрос: может ли селениум осуществлять поиск по части видимого текста?
VasiliyS
Кажется мне удалось сделать работу скрипта устойчивей. Я изменил порядок заполнения полей. Ввел даты за весь месяц. Все совпало!

 #!/usr/bin/python3.8
#WARNING! INSTALL selenium-DRIVER TO YOUR BROWSER!!!
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select
import sys
#============================================================
#Adjustment script
#ID stantion:
Station = "RU000Q"
#Init web-browser
driver = webdriver.Chrome()
driver.set_window_size(1600, 2048)
#driver.maximize_window()
#etc
Zoom = 7
Date = sys.argv[1]
#Folder for screenshot
fold = "/home/vas/RMS_Processing/" + Station + "_" + Date + "screenie.png"
#============================================================
#Goto link
driver.get('https://tammojan.github.io/meteormap/');
#Waiting
time.sleep(5)
#Find my stantion
driver.find_element(By.XPATH, '//*[@id="stationSearch"]').send_keys(Station)
#Filter my stantion
driver.find_element(By.XPATH, '//*[@id="stationsFilter"]').send_keys(Station)
#Select date
S_date = driver.find_element_by_xpath("//*[@id='datasetDropdown']/option[contains(text(),'%s')]" %Date)
#Waiting
time.sleep(5)
S_date.click()
#Waiting
time.sleep(3)
#Select ZOOM
n=1
while(n<=8-Zoom):
	driver.find_element(By.XPATH, '//*[@id="mapid"]/div[2]/div[1]/div[1]/a[2]').click()
	time.sleep(3)
	n = n + 1
		
#Waiting
time.sleep(15)
if driver.find_element_by_xpath('//*[@id="rowcount"]').text == '0':
	driver.close()
#Screenshot
driver.find_element_by_tag_name('body').screenshot(fold)
#Download *.csv and *.klm - files
driver.find_element(By.XPATH, '//button[text()="Download selection as CSV"]').click()
driver.find_element(By.XPATH, '//button[text()="Download selection as KML"]').click()
#Waiting
time.sleep(5)
#Close browser
driver.quit()

Спасибо за ваш вариант кода. Из него я тоже многое для себя отметил!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB