2

Использование селена и хромового драйвера. Python 3.5Невозможно выбрать составной элемент с селеном с использованием python

Представьте себе время начала и окончания времени. Вы щелкаете в поле времени начала и появляются часы. Стартовые часы выравниваются влево, а конечные часы выравниваются по правому краю.

<div class="popover clockpicker-popover top clockpicker-align-left" style="display: block; top: 511px; left: 287px;"> 

enter image description here enter image description here

<div class="clockpicker-dial clockpicker-hours" style="visibility: visible;"></div> 

<div class="clockpicker-dial clockpicker-minutes" style="visibility: visible;"></div> 

Затем нажмите на время окончания коробки:

enter image description here enter image description here

<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:

Похоже, он находит часы, но он печатает кучу пустых линий, заставляет меня думать, что это все еще на первых часов, который скрыт, когда второй тактовый идет вверх.

enter image description here

Когда я изменить свое заявление для печати от print(hour.text) к print(hour) он показывает это:

enter image description here

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 

ответ

1

Я думаю, ваша проблема вызвана опечаткой в ​​вашем селекторе:

'popover.clockpicker-popover.top.clockpicker-align-left' 

на самом деле означает, что вы хотите обрабатывать

<popover class="clockpicker-popover top clockpicker-align-left"> 

элемента, поэтому вам нужно добавить ведущую точку в

'.popover.clockpicker-popover.top.clockpicker-align-left' 
0

Таким образом, это звучит, как он хлопает первые часы (выравнивание налево), но ваша ошибка указывает на то, что именно этот элемент, который не удается. Это кажется неправильным ...

Кроме того, вы указываете, что вам нужно на самом деле щелкнуть первые часы до появления второго, и я не вижу, где вы это делаете.

+0

Я обновил свой вопрос с большим количеством кода. Поэтому я нажимаю на поле ввода с идентификатором элемента 'StartTime' и появляются часы. Если бы я избавился от селектора 'popover.clockpicker-popover.top.clockpicker-align-left', мой код работает для первых часов, но когда я перехожу на второй такт, он не работает. –

+0

Я предполагаю, что это связано с тем, что появились другие часы, но я его на самом деле не выбрал, и он все еще читает часы/минуты с первых часов, которые теперь скрыты, потому что он исчезает, когда появляются эти часы. –

+0

Ах, я думал, что оба часа остались видимыми. В таком случае, я бы сказал, получаю значения от первых часов, нажимаю на него, получаю валы со второго ... Но я уверен, что ты уже понял это. :-) –