LoginSignup
souwasora
@souwasora (takei souwa)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

python selenium id毎回変更する場合の取得方法

解決したいこと

とあるサイトにて、seleniumを用いて、在庫確認をしたい(あったらカートに入れる)
郵便番号を打ち込む際に、
input idが毎回変わる(valueの値は無視してください)
class nameでは取得できないので、idまたはxpathを用いて取得しており、どのようにして可変的な情報を取得するのかが、分かりません。
スクリーンショット 2022-12-06 17.10.57.png
ポップアップ表示させ、郵便番号を入力し、近くの店舗で在庫見る
なければ閉じ再度実施するという事をしたいです。
最終的には、毎朝7時半とかに確認を考えています
その為、可変的に変更するとループ処理ができないので、困っています

発生している問題・エラー

現在はこのxpathで取れているが、ページ更新する度に変わってしまう

#郵便番号
serch = browser.find_element_by_xpath('//*[@id="0e51a970-7536-11ed-ae51-fb76699b865d"]')
serch.send_keys('104-0061')

または、問題・エラーが起きている画像をここにドラッグアンドドロップ

該当するソースコード

上記省略
#受取日取得(ポップアップ表示)
elem_button = browser.find_element_by_xpath('//*[@id="root"]/div[2]/div[3]/div[4]/div/div/div/div/div/div[3]/div/div/div/div[1]/div/div[2]/div/div/button')
elem_button.click()
#郵便番号
serch = browser.find_element_by_xpath('//*[@id="0e51a970-7536-11ed-ae51-fb76699b865d"]')
serch.send_keys('104-0061')

自分で試したこと

ご教示お願いします

1

3Answer

CSSとXPATH、お好きな方を選んでください。
placeholder="郵便番号" が複数あって、希望の箇所に入力できないのであれば
find_elementを複数形にした上でHTMLの上から何番目かを指定してあげる必要があります。

selenium3系
driver.find_element_by_css_selector('input[placeholder="郵便番号"]').send_keys("000-0000")
driver.find_element_by_xpath('//input[@placeholder="郵便番号"]').send_keys("000-0000")
senium4系
driver.find_element(By.CSS_SELECTOR, 'input[placeholder="郵便番号"]').send_keys("000-0000")
driver.find_element(By.XPATH, '//input[@placeholder="郵便番号"]').send_keys("000-0000")
0Like

Comments

  1. @souwasora

    Questioner
    @kawagoe6884様
    selemim3系の記述でそのような取り方があるとは知らず、、勉強不足でした。
    ご教示ありがとうございます。

inputであればそんなに多数ある訳でもないと思いますので、「受取日取得」のXPATHと似たように詳しく場所を絞り込む形で指定してはいかがでしょうか?

0Like

とあるサイトがクローリングを拒否しているか?webサイトを確認し、必要に応じて、先方と対話を推奨します。
 常識の範囲でクローリングを行いましょう!

class nameでは取得できないので
そもそも、find_element(By.ID,
"#0e51a9...")がID指定ですよ!

さて、
idがダメならnameで・・

name="search" は htmlの表現で
webDriverの表現は "#search" です。


browser.find_element(By.NAME, "#search").click()

browser.find_elements(By.NAME, "#search")[0].click()

では?どうでしょう。find_elements と[0]はsearchが複数あるときの先頭を意味します。

find_element_by_xpathは古い仕様では?まだ、廃止されることはありませんが・・・

因みに、webDriver内部では1個しかIDがなくとも、find_elementsが利用でき、IDとNAMEの値が同じでも検索でき、さらに、ID="search"でも、(By.NAME, "#search")で検索できます。

0Like

Comments

  1. @souwasora

    Questioner
    @HalHarada様
    browser.find_element(By.NAME, "search").click()
    で取得することができました。
    ご教示ありがとうございます
  2. おめでとうございます。
    #いらないのね!

Your answer might help someone💌