質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.78%

Python,selenium,要素をクリック出来ない

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 3,690

score 5

前提・実現したいこと

全くの初心者です。色々なページを参考にしながら作ってます。
Pythonとselenium、chromeで
Xpath要素が有効かどうか調べて、無効であればページを更新する。
有効であればボタンをクリックして次の工程に進む
(これは多分成功しました)
これを5回(回数は未定)とか繰り返す処理にしたいが、繰り返し処理の中に入れると無効の間は更新してくれるが有効になってもボタンリックしてくれずに止まってしまいます。

質問の方法もよくわかっていません。見づらくなってしまいました。

発生している問題・エラーメッセージ

そもそも繰り返し処理に入れる前には出なかった箇所でエラーも出ている様子
AttributeError: 'NoneType' object has no attribute 'is_enabled'
PS C:\driver> & C:/Users/◎◎/AppData/Local/Programs/Python/Python37-32/python.exe c:/driver/.py Traceback (most recent call last): File "c:/driver/.py", line 45, in <module>
reserve2_btn = driver.find_element_by_xpath('//*[@id="contener"]/form/dl/dt[11]/input')
File "C:\Users\◎◎\AppData\Local\Programs\Python\Python37-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 394, in find_element_by_xpath
return self.find_element(by=By.XPATH, value=xpath)
File "C:\Users\◎◎\AppData\Local\Programs\Python\Python37-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 978, in find_element        
'value': value})['value']
File "C:\Users\◎◎\AppData\Local\Programs\Python\Python37-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
self.error_handler.check_response(response)
File "C:\Users\◎◎\AppData\Local\Programs\Python\Python37-32\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response   
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id="contener"]/form/dl/dt[11]/input"}
(Session info: chrome=78.0.3904.70)

該当のソースコード

<Python>

i=0
while i < 5:
    reserve2_btn = driver.find_element_by_xpath('//*[@id="contener"]/form/dl/dt[11]/input')
    print(reserve2_btn.is_enabled())
    if not reserve2_btn.is_enabled() == True:
        print("無効")
        time.sleep(2)
        driver.refresh()
    else:
        reserve2_btn.click()
     driver.quit()
    i=i+1

``

試したこと

待機
driver.implicitly_wait(20)

WebDriverWait(driver,10).until(EC.presence_of_element_located((By.xpath, '//*[@id="contener"]/form/dl/dt[11]/input')))

スクロール
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

他にも色々、よくわからないので検索して出てきたものをコピペして少し修正するも基礎がわかっていないのでそれ自体がエラーになり深みにはまってしまいました。

補足情報(FW/ツールのバージョンなど)

Python3.7.4
ボタンが無効の時
<input type="button" disabled="" name="btn_res" class="btn" value="  ×空きなし  ">
ボタンが有効の時
<input type="submit" name="btn_res" class="btn" value="予約する">

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • meg_

    2019/10/28 00:03

    ループ処理を入れる前のコードも掲載されると分かりやすいかもしれません。

    キャンセル

  • mpanda

    2019/10/28 23:08

    ループ処理を入れる前のコードは1行目、2行目と最後の行を除いたものです。
    補足ですが、ループ処理を入れた後も初めからelseになる場合(Xpatheが有効)にはクリック出来るが何回か無効が繰り返された後に有効になった後にはクリック出来ないようです。

    キャンセル

回答 1

checkベストアンサー

0

xpathを使うべきDOMではないですね。

count = 5

for _ in range(count):
    if driver.find_element_by_name('btn_res').get_attribute('value') == '予約する':
        # 有効
        break
    else:
        # 無効
        driver.refresh()
        time.sleep(5)
else:
    print(str(count) + '回更新しましたが全部ボタンが無効でしたのでプログラムを終了します')
    driver.quit()
    exit()

print('ボタンが押せる状態だったのでボタンを押します')
driver.find_element_by_name('btn_res').click()

# ボタンを押せた後にやりたい処理をこれ以降に書いていく

察するにチケットキャンセル待ちの監視用プログラムか何かでしょうか。

起こっているエラーがNoSuchElementExceptionのようですので、
このボタンのxpathは何らかの条件によって変化するため、
[@id="contener"]/form/dl/dt[11]/inputで固定にしたことにより
エラーが発生したと推測しました。

xpathはこのようなDOMには非常に弱い武器なので、
name属性やid属性があれば素直にそちらを利用してください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/11/01 12:08

    回答ありがとうございます。
    とても勉強になり、なるほどそういうことかと感動しました。
    ただ、まだ実際に丁度よい例がなくて実験出来てないのです。
    多分行けそうな気はするのですが。
    週末に探してチャレンジしてみます…
    もしダメだったらまた設問させて下さい。
    よろしくお願いします

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る