2

Verwendung von Selen- und Chromtreibern. Python 3.5Kombiniertes Element mit Selen kann nicht mit Python ausgewählt werden

Stellen Sie sich eine Startzeit und Endzeit Box. Sie klicken in die Startzeit-Box und eine Uhr erscheint. Die Startuhr ist linksbündig und die Enduhr ist rechtsbündig.

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

Dann klicken Sie in die Endzeit-Box:

enter image description here enter image description here

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

Gleiche Stunden und Minuten.

Mein Problem ist die Auswahl der linken und rechten Versionen der Uhr. In der Tat funktionierte mein Code gut, bis ich die Endzeit eingeben musste und so entschied ich mich, Code hinzuzufügen, um sie zu unterscheiden.

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() 

Fehler:

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"popover.clockpicker-popover.top.clockpicker-align-left"}

Wenn ich entfernen, dass driver.find_element_by_css_selector('popover.clockpicker-popover.top.clockpicker-align-left') es zum ersten Takt funktioniert gut und ich kann durch einen Klick in das Eingabefeld für den zweiten Takt öffnen, aber ich kann nicht Wählen Sie eigentlich die zweite Uhr oder ihre Elemente.

Update:

Es scheint, wie es die Stunden findet, aber es gibt eine Reihe von leeren Zeilen aus, die ich bin es nach wie vor auf dem ersten Takt denken läßt, die verborgen ist, wenn der zweite Takt kommt.

enter image description here

Wenn ich meine print-Anweisung print(hour.text)-print(hour) ändern es zeigt dies:

enter image description here

24 Elemente für die 24 Stunden.

ANTWORT:

ich die Perioden vor popover.clockpicker... hinzugefügt und den beigefügten auch die nächste Fund Element von CSS-Selektor und es funktionierte! Vielen Dank für Ihre Hilfe.

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 

Antwort

1

Ich denke, das Problem durch Tippfehler in Ihrem Selektor verursacht:

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

eigentlich bedeutet, dass Sie

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

Element zu handhaben wollen, so dass Sie als

führenden Punkt hinzufügen müssen
'.popover.clockpicker-popover.top.clockpicker-align-left' 
0

So klingt es wie es ist die erste Uhr knallt (align links), aber Ihr Fehler zeigt an, dass es dieses Element ist, die fehlschlägt. Das scheint falsch ...

Auch Sie erwähnen, dass Sie tatsächlich in die erste Uhr klicken müssen, bevor die zweite erscheint, und ich sehe nicht, wo Sie das tun.

+0

Ich habe meine Frage mit mehr Code aktualisiert. Also klicke ich in das Eingabefeld mit der Element-ID 'StartTime' und die Uhr erscheint. Wenn ich den "popover.clockpicker-popover.top.clockpicker-align-left" Selektor losgeworden bin, funktioniert mein Code für die erste Uhr, aber wenn ich zur zweiten Uhr gehe, funktioniert es nicht. –

+0

Ich schätze, das liegt daran, dass die zweite Uhr erschienen ist, aber ich habe sie nicht ausgewählt und sie liest immer noch Stunden/Minuten von der ersten Uhr, die jetzt versteckt sind, weil sie verschwindet, wenn diese Uhr erscheint. –

+0

Ah, ich dachte beide Uhren blieben sichtbar. In diesem Fall würde ich sagen, die Werte von der ersten Uhr bekommen, klicken Sie darauf, holen Sie sich die Werte von der Sekunde ... Aber ich bin sicher, dass Sie das schon herausgefunden haben. :-) –

Verwandte Themen