souripresident
@souripresident

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

seleniumで複数ある要素を絞り込んで押したい

解決したいこと

プログラミング初心者です。
Python+seleniumで、とある席予約サイトのキャンセル席を自動で取るプログラムを書いています。こちらのサイトでは、席の階数毎に"席選択"というボタンが割り振られているのですが、キャンセルが出た場合は押せるようになっています。
"席選択"のボタンを

driver.find_elements(By.XPATH, '//*[@class="btn_01"]')

で取得を試みましたが、画面上には表示されていない同名の要素もあるらしいので

seat = driver.find_elements(By.XPATH, '//*[@class="btn_01"]')
for seat in driver.find_elements(By.XPATH, '//*[@class="btn_01"]'):
        if seat.is_displayed():
            seat.click()

とすると、キャンセル席が複数あった場合にその全てが押されてしまっているのか

ElementClickInterceptedException

と出ます。そこで取りたい席の料金(階数によってバリエーションがあります)によってクリックする席を絞り込もうと考えたのですが、表示されている料金のテキストと"席選択"ボタンを関連付けることができず困っています。

該当するソースコード

<div class="price">1000円</div>
 <div id="Main_SeatListItemRepeater_SeatListItem_8_PnlAutoSelectButton_8">
		
        <input type="radio" id="modal_open_8" class="modal_open" name="modal_trigger">
        <label for="modal_open_8" class="btn_01" x-bind="popupTrigger">
            席選択</label>      

自分で試したこと

とにかく表示されていて、かつ金額が1000円または1200円と表示されている"おまかせ席選択"を押すために訳が分からなくなりながら下記コードを書きました。まずこのコードがちゃんと絞り込めているのか分かりませんが、これでも複数該当する(テストでは実際も複数キャンセルが出ているので該当すること自体は正しいです)押すことはできますがエラーが出てしまいます。

seat_price = driver.find_elements(By.XPATH, '//*[@class="price"]')
i = 0

while True:
    for seat in driver.find_elements(By.XPATH, '//*[@class="btn_01"]'):
        if seat.is_displayed() and seat_price[i].text == "1000円":
            seat.click()
            break
        elif seat.is_displayed() and seat_price[i].text == "1200円":
            seat.click()
            break
        else:
            i += 1
            time.sleep(0.1)

複数該当する場合はその中でも順番が早い要素、indexが小さい要素を押したいです。
何か他に良い案や改善策があればご教授ください。
また、自分でも質問文を読み返して意味が分からないので、補足が必要であれば教えてください。よろしくお願いします。

0

1Answer

'//*[@class="btn_01"]'の様な 相対XPath を使用されていますが、絶対XPath を使用したら解決しませんか?
絶対XPath を使用すると、一意に要素を特定できます。

0Like

Your answer might help someone💌