2

セレンとクロームドライバを使用しています。 Python 3.5pythonを使用してセレンで複合元素を選択できません

開始時刻と終了時刻を想像してください。開始時刻ボックスをクリックすると、時計が表示されます。開始クロックは左に揃えられ、終了クロックは右に揃えられます。

<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-left" style="display: block; top: 511px; left: 287px;"> 

enter image description here enter image description here

その後、終了時刻ボックスにクリックしてください:

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

エラー:私はそれが最初のクロックのために正常に動作し、私はそれのための入力ボックスにクリックすることにより、第2のクロックを開くことができますが、私はできませんdriver.find_element_by_css_selector('popover.clockpicker-popover.top.clockpicker-align-left')ことを取り除く

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

実際には第2のクロックまたはその要素を選択する。

更新:

それは時間を見つけたように思えますが、それは私はそれが第2のクロックが立ち上がったときに隠されている最初のクロックにまだだと思います空行の束を出力します。

enter image description here

私はprint(hour)print(hour.text)から私のprint文を変更すると、それはこの示しています。24時間

enter image description here

24の要素を。

ANSWER:

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

だから、それは最初のクロックを(揃える左)飛び出るているように聞こえるが、あなたのエラーは、それが失敗している。この要素であることを示しています。それは間違っているようです...

また、最初の時計を実際にクリックしてから2番目の時計が表示されなければならないと言います。

+0

質問をより多くのコードで更新しました。そこで、要素ID「StartTime」で入力ボックスをクリックすると、時計が表示されます。私が 'popover.clockpicker-popover.top.clockpicker-align-left'セレクタを取り除くと、私のコードは最初のクロックで動作しますが、2番目のクロックに移動すると動作しません。 –

+0

私はこれは2番目の時計が出現したが、実際にはそれを選択していないので、この時計が現れたときに消えてしまっているので最初の時計から時間/分を読み込んでいるためです。 –

+0

ああ、私は両方の時計が見えていると思った。その場合は、最初の時計から値を取得し、それをクリックし、2番目の値を取得すると言うでしょう...しかし、私はあなたがすでにそれを考え出したと確信しています。 :-) –

関連する問題