Использование селена и хромового драйвера. Python 3.5Невозможно выбрать составной элемент с селеном с использованием python
Представьте себе время начала и окончания времени. Вы щелкаете в поле времени начала и появляются часы. Стартовые часы выравниваются влево, а конечные часы выравниваются по правому краю.
<div class="popover clockpicker-popover top clockpicker-align-left" style="display: block; top: 511px; left: 287px;">
<div class="clockpicker-dial clockpicker-hours" style="visibility: visible;"></div>
<div class="clockpicker-dial clockpicker-minutes" style="visibility: visible;"></div>
Затем нажмите на время окончания коробки:
<div class="popover clockpicker-popover top clockpicker-align-right" style="display: block; top: 511px; left: 287px;">
Такие же часы и минуты.
Моя проблема заключается в выборе левой и правой версий часов. На самом деле, мой код работал нормально, пока мне не пришлось положить конец, и поэтому я решил добавить код, чтобы отличить их.
import time, sys
from selenium import webdriver
# open chrome and go to website
driver = webdriver.Chrome()
driver.get('website')
time.sleep(3)
def startHour(number):
# If I remove this line I can select hours/mins for first clock but not second clock
driver.find_element_by_css_selector('popover.clockpicker-popover.top.clockpicker-align-left')
select = driver.find_element_by_css_selector('.clockpicker-dial.clockpicker-hours')
print('Selected clockpicker hours')
for hour in select.find_elements_by_class_name('clockpicker-tick'):
print(hour.text)
if hour.text == number:
print('Hour.text: ' + hour.text)
print('Hour: ' + number)
hour.click()
break
def endHour(number):
driver.find_element_by_css_selector('popover.clockpicker-popover.top.clockpicker-align-right')
select = driver.find_element_by_css_selector('.clockpicker-dial.clockpicker-hours')
print('Selected clockpicker hours')
for hour in select.find_elements_by_class_name('clockpicker-tick'):
print(hour.text)
if hour.text == number:
print('Hour.text: ' + hour.text)
print('Hour: ' + number)
hour.click()
break
def clickMinutes(number):
select = driver.find_element_by_css_selector('.clockpicker-dial.clockpicker-minutes')
print('Selected clockpicker minutes')
for minutes in select.find_elements_by_class_name('clockpicker-tick'):
print(minutes.text)
if minutes.text == number:
print('Minutes.text: ' + minutes.text)
print('Minutes: ' + number)
minutes.click()
break
# Select start time input box, start time clock appears
driver.find_element_by_id('StartTime').click()
startHour('7')
time.sleep(4)
clickMinutes('30')
time.sleep(4)
# Select end time input box, end time clock appears
driver.find_element_by_id('EndTime').click()
time.sleep(4)
endHour('16')
time.sleep(4)
clickMinutes('00')
time.sleep(4)
driver.quit()
sys.exit()
Ошибка:
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"popover.clockpicker-popover.top.clockpicker-align-left"}
Когда я извлекаю, что driver.find_element_by_css_selector('popover.clockpicker-popover.top.clockpicker-align-left')
она отлично работает для первых часов, и я могу открыть второй часы, нажав в поле ввода для него, но я не могу фактически выберите второй такт или его элементы.
Update:
Похоже, он находит часы, но он печатает кучу пустых линий, заставляет меня думать, что это все еще на первых часов, который скрыт, когда второй тактовый идет вверх.
Когда я изменить свое заявление для печати от print(hour.text)
к print(hour)
он показывает это:
24 элементов для 24 часов.
ОТВЕТ:
Я добавил периоды перед popover.clockpicker...
, а также добавляется следующий элемент найти селектор CSS и это сработало! Спасибо всем за вашу помощь.
def startHour(number):
select = driver.find_element_by_css_selector('.popover.clockpicker-popover.top.clockpicker-align-left').find_element_by_css_selector('.clockpicker-dial.clockpicker-hours')
print('Selected clockpicker hours')
for hour in select.find_elements_by_class_name('clockpicker-tick'):
print(hour.text)
if hour.text == number:
print('Hour.text: ' + hour.text)
print('Hour: ' + number)
hour.click()
break
def endHour(number):
select = driver.find_element_by_css_selector('.popover.clockpicker-popover.top.clockpicker-align-right').find_element_by_css_selector('.clockpicker-dial.clockpicker-hours')
print('Selected clockpicker hours')
for hour in select.find_elements_by_class_name('clockpicker-tick'):
print(hour.text)
if hour.text == number:
print('Hour.text: ' + hour.text)
print('Hour: ' + number)
hour.click()
break
Я обновил свой вопрос с большим количеством кода. Поэтому я нажимаю на поле ввода с идентификатором элемента 'StartTime' и появляются часы. Если бы я избавился от селектора 'popover.clockpicker-popover.top.clockpicker-align-left', мой код работает для первых часов, но когда я перехожу на второй такт, он не работает. –
Я предполагаю, что это связано с тем, что появились другие часы, но я его на самом деле не выбрал, и он все еще читает часы/минуты с первых часов, которые теперь скрыты, потому что он исчезает, когда появляются эти часы. –
Ах, я думал, что оба часа остались видимыми. В таком случае, я бы сказал, получаю значения от первых часов, нажимаю на него, получаю валы со второго ... Но я уверен, что ты уже понял это. :-) –