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;">
<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:
<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.
Wenn ich meine print-Anweisung print(hour.text)
-print(hour)
ändern es zeigt dies:
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
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. –
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. –
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. :-) –