hogu
@hogu

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

seleniumでプルダウンが選択できない・・・

解決したいこと

不動産ライブラリを活用して、指定した不動産価格(取引価格・成約価格)情報の検索・ダウンロードしたいです。ブラウザ操作で取得できる「最寄り駅」と「最寄り駅からの徒歩(分)」がAPIを利用すると取得ができません。seleniumのブラウザ操作でダウンロードしたいが、プルダウンが選択できません。

ラジオボタンのクリックは成功しているのですが、プルダウンが選択できません。

image.png

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

エラーが発生しました: Message: 
Stacktrace:
        GetHandleVerifier [0x00007FF7F077EEB2+31554]
        (No symbol) [0x00007FF7F06F7EE9]
        (No symbol) [0x00007FF7F05B872A]
        (No symbol) [0x00007FF7F0608434]
        (No symbol) [0x00007FF7F060853C]
        (No symbol) [0x00007FF7F064F6A7]
        (No symbol) [0x00007FF7F062D06F]
        (No symbol) [0x00007FF7F064C977]
        (No symbol) [0x00007FF7F062CDD3]
        (No symbol) [0x00007FF7F05FA33B]
        (No symbol) [0x00007FF7F05FAED1]
        GetHandleVerifier [0x00007FF7F0A88B2D+3217341]
        GetHandleVerifier [0x00007FF7F0AD5AF3+3532675]
        GetHandleVerifier [0x00007FF7F0ACB0F0+3489152]
        GetHandleVerifier [0x00007FF7F082E786+750614]
        (No symbol) [0x00007FF7F070376F]
        (No symbol) [0x00007FF7F06FEB24]
        (No symbol) [0x00007FF7F06FECB2]
        (No symbol) [0x00007FF7F06EE17F]
        BaseThreadInitThunk [0x00007FFBBCFB7374+20]
        RtlUserThreadStart [0x00007FFBBDE1CC91+33]

該当するソースコード

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# ブラウザを起動(Chromeの場合)
driver = webdriver.Chrome()

try:
    # ウェブページを開く
    driver.get('https://www.reinfolib.mlit.go.jp/realEstatePrices/')

    # ラジオボタンをクリック
    radio_button = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.ID, 'spnStation'))
    )
    radio_button.click()

    # オプションを選択するために、JavaScriptで対象のオプションを直接クリックする
    option_value = "3600"  # 選択したいオプションの値
    option_xpath = f"//option[@value='{option_value}']"
    option_element = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.XPATH, option_xpath))
    )
    driver.execute_script("arguments[0].click();", option_element)
    print("Selected option:", option_element.text)
    print(f"セレクトボックスからオプション '{option_value}' を選択しました。")

   # cmbStationsSpのセレクトボックスが表示されるのを待つ
    select_station = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, 'cmbStationsSp'))
    )
    print(select_station)

    # JavaScriptを使用してセレクトボックスを展開する
    driver.execute_script("arguments[0].click();", select_station)

    # オプションを選択するために、JavaScriptで対象のオプションを直接クリックする
    station_option_value = "01730"  # 選択したいオプションの値
    station_option_xpath = f"//option[@value='{station_option_value}']"
    station_option_element = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.XPATH, station_option_xpath))
    )
    driver.execute_script("arguments[0].click();", station_option_element)
    print("Selected option:", station_option_element.text)
    print(f"セレクトボックスからオプション '{station_option_value}' を選択しました。")

except Exception as e:
    print(f"エラーが発生しました: {e}")

finally:
    driver.quit()


自分で試したこと

id指定、クラス指定、select_by_value( )など一通り試したのですが、クリックが行われずエラーになりました。
JavaScriptを使用してセレクトボックスをクリックすると、クリックされているようなのですが、目視確認はできませんでした。

要素がクリック可能かどうかを確認

if select_element.is_displayed() and select_element.is_enabled():
    print("cmbRegionsSpの要素はクリック可能です。")
    # JavaScriptで要素をクリック
    driver.execute_script("arguments[0].click();", select_element)
    print("JavaScriptで要素をクリックしました。")
else:
    print("cmbRegionsSpの要素はクリック不可能です。")

結果は、cmbRegionsSpの要素が存在します。
cmbRegionsSpの要素はクリック不可能です。
という結果でした。

参考記事:
https://qiita.com/peter_0309/items/40c31cc4e5e1f170d48e
https://qiita.com/tsutsuitou/items/08eb66e7fc8db97bfcb6
https://python.allmaintenance.jp/programing/python/python%E3%81%AEselenium%E3%81%A7%E3%83%89%E3%83%AD%E3%83%83%E3%83%97%E3%83%80%E3%82%A6%E3%83%B3%E3%82%92%E9%81%B8%E6%8A%9E%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/

0

2Answer

select 要素は JavaScriptで click() しても反応しません。 Selenium から操作するには専用の Select クラスを使ってください。

from selenium.webdriver.support.select import Select
# ...
select = Select(select_station)
select.select_by_value(station_option_value)

参考:

1Like

ご回答ありがとうございます。
1つ目のプルダウンは選択できたのですが、2つ目のプルダウンが選択できません。
プルダウンを選択できた処理↓

# 線路をクリック
select_line = WebDriverWait(driver, 20).until(
    EC.element_to_be_clickable((By.ID, 'cmbRoutes'))
)
select = Select(select_line)
select.select_by_value("3600")
print("線路を選択しました。")

プルダウンを選択できなかった処理

# 駅のセレクトボックスが表示されるのを待つ
select_station = WebDriverWait(driver, 20).until(
    EC.element_to_be_clickable((By.ID, 'cmbStationsSp'))
)

エラーが発生するもメッセージで確認できませんでした。
要素が見つからないと思われます。
そこで要素を見つけるために下記処理に変更。

# 駅のセレクトボックスが表示されるのを待つ
select_station = WebDriverWait(driver, 20).until(
    EC.presence_of_element_located((By.NAME, 'cmbStationsSp'))
)
select_station = Select(select_station)
select_station.select_by_value('01728')    

エラーメッセージ

Message: javascript error: {"status":11,"value":"Element is not currently visible and may not be manipulated"}

要素が見つかっているかの確認のため、駅のオプションを表示してみる。

# 駅のセレクトボックスのオプションを表示
select_station = Select(driver.find_element(By.ID, 'cmbStationsSp'))
options = [option.get_attribute("value") for option in select_station.options]
print("駅のセレクトボックスのオプション:", options)

出力結果

駅のセレクトボックスのオプション: ['0', '01728', '02165', '03272', '01944', '01654', '03095', '03303', '02716', '01908', '01476', '02866', '01677', '01883', '02491', '02739', '02755', '01631', '01627', '01736', '01483', '01923', '02590', '03241', '02354', '02827', '02498', '09909', '02236', '01687', '01730', '01868', '01911', '02573', '02327', '02856', '03260', '02186', '01925', '01546', '03230', '02767', '01567', '02337', '03251', '02095', '03013', '01721']

駅のオプションは表示されいるため、selectメソッドを利用してみるも、下記エラーに。。。

Selectオブジェクトを使用して駅を選択

select_station = Select(select_station)
print(select_station)
# 最初のオプションを選択(例: '01728' 大宮(埼玉))
select_station.select_by_value('01728')          #エラーが発生しました: 'Select' object has no attribute 'tag_name'
select_station.select_by_visible_text('与野') #:エラーが発生しました: 'Select' object has no attribute 'tag_name'
select_station.select.select_by_index(1)  #エラーが発生しました: 'Select' object has no attribute 'tag_name'

--
数時間戦ったのですが、原因が分かりません。。。お力を貸していただけると幸いです。

0Like

Comments

  1. フォームは React によって動的に再描画されるので、1個目のセレクトボックスを選択した後のタイミングによっては、2個目が再描画中でうまく取得できないことが考えられます。1個目を操作した後、適当な時間 sleep してから2個目を取得して操作してみてください。

    import time
    time.sleep(1)
    select_station = Select(driver.find_element(By.ID, 'cmbStationsSp'))
    
  2. @hogu

    Questioner

    sleepも試したのですが、結果は同じでした
    、、ご丁寧に本当にありがとうございます!!

  3. まだ 'Select' object has no attribute 'tag_name' エラーが出ているということであれば、このエラーは Select() の引数に Select オブジェクトを渡した時に出るので、そうならないように(つまり Select() には Select でラップしていない要素オブジェクトを渡すように)してください。

  4. @hogu

    Questioner

    ありがとうございます!試したのですが、下記エラーがでます。
    selectタグで選択すると、javascript errorになり、
    javascript errorで実行すると選択できずの状態となります。。

    --
    エラーが発生しました: Message: javascript error: {"status":11,"value":"Element is not currently visible and may not be manipulated"}

    現在実行しているコードは下記となります。

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.select import Select
    import time
    
    #ブラウザを起動(Chromeの場合)
    driver = webdriver.Chrome()
    
    try:
        # ウェブページを開く
        driver.get('https://www.reinfolib.mlit.go.jp/realEstatePrices/')
    
        # 「rdoStation」というIDを持つラジオボタンをクリック
        radio_button = WebDriverWait(driver, 20).until(
            EC.element_to_be_clickable((By.ID, 'spnStation'))
        )
        radio_button.click()
        print("ラジオボタンをクリックしました。")
        
        # 1秒間ブラウザを表示
        time.sleep(1)
    
        # 線路をクリック
        select_line = WebDriverWait(driver, 20).until(
            EC.element_to_be_clickable((By.ID, 'cmbRoutes'))
        )
        select = Select(select_line)
        select.select_by_value("3600")
        print("線路を選択しました。")
        time.sleep(1)
    
    
        # 駅のセレクトボックスが表示されるのを待つ
        select_station = WebDriverWait(driver, 20).until(
            EC.presence_of_element_located((By.NAME, 'cmbStationsSp'))
        )
        # 1秒間ブラウザを表示
        time.sleep(1)
    
        # 駅のセレクトボックスのオプションを表示
        select_station = Select(driver.find_element(By.ID, 'cmbStationsSp'))
        options = [option.get_attribute("value") for option in select_station.options]
        print("駅のセレクトボックスのオプション:", options)
    
        time.sleep(1) 
        # Selectオブジェクトを使用して駅を選択
        #select_station = Select(select_station)
        print(select_station)
        # 最初のオプションを選択(例: '01728' 大宮(埼玉))
        select_station.select_by_value('01728')          #エラーが発生しました: 'Select' object has no attribute 'tag_name'
        #select_station.select_by_visible_text('与野') #:エラーが発生しました: 'Select' object has no attribute 'tag_name'
        #select_station.select.select_by_index(1)  #エラーが発生しました: 'Select' object has no attribute 'tag_name'
            # JavaScriptで表示を強制する
        #driver.execute_script("arguments[0].style.display = 'block';", select_station)
        print("駅を選択しました。")
    
        # 1秒間ブラウザを表示
        time.sleep(1)
    
    except Exception as e:
        print(f"エラーが発生しました: {e}")
    
    finally:
        driver.quit()
    

    何卒宜しくお願い致します。。

  5. エラーは何行目で出ていますか?

  6. @hogu

    Questioner

    select_station.select_by_value('01728') の処理で発生しています。
    駅をクリックしようとすると発生します。ありがとうございます。。
    image.png

  7. なぜかは分かりませんが、駅のセレクトボックスは ID が cmbStations のものと cmbStationsSp のものの2つ存在します。矢印が指しているのは cmbStations のほうです。 cmbStationsSp は画面上には存在せず、コードではそれを選択して操作しているのでエラーが出ています。

    driver.find_element(By.ID, 'cmbStations') に直してください。

  8. @hogu

    Questioner

    本当ですね、、!!できました!本当に本当にありがとうございます!!

  9. 解決して良かったです!問題がなくなったのであれば質問のクローズをお願いします。

  10. @hogu

    Questioner

    最後のダウンロード処理もできました、1週間苦戦したので、本当に助かりました、、!!
    不動産APIを利用して価格を取得したのですが、最寄り駅と最寄り駅からの距離が取得できず、画面操作しかないと、大変苦労したのですが、uasiさんのおかげでできるようになりました。。本当にありがとうございました!!!

Your answer might help someone💌