Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

find_element_by_idで要素を取得できない。

実現したいこと

html上の「ファイルを選択」ボタンを取得してクリックさせたい。(画像の赤い四角)
error02.png

試したこと

python3にてSelenium Chrome webdriverを使用し取得を試みた。

from selenium import webdriver
url = 'http://_____'
driver = webdriver.Chrome("C:\Program Files (x86)\chromedriver")
driver.get(url)
tm.sleep(1)
driver.find_element_by_id('f1').click()

結果

「selenium.common.exceptions.InvalidArgumentException: Message: invalid argument(Session info: chrome=84.0.4147.135)」
というエラーが返ってきた。

教えてほしいこと

要素にはidがあるので、find_element_by_idで取得できると思ったができなかった。
その理由と、取得しクリックするための解決策を教えていただければ幸いです。

0

2Answer

2 点質問と提案になります。

1. 実行結果

「selenium.common.exceptions.InvalidArgumentException: Message: invalid argument(Session info: chrome=84.0.4147.135)」
というエラーが返ってきた。

こちらのエラーに関するトレースバック(何行目のコードを実行しようとした結果例外が発生したなど)はありますでしょうか?
それがわかると、stack overflow などで同じエラーで悩んでいる方が他にも見つかるかもしれません:wink:

2. 実行方法

@takaekokaz 様が今回実行されたコードは、ファイルからの実行でしょうか?
もしファイルからの実行であれば、一度ターミナルより python でインタラクティブシェルを起動し、該当のコードを 1 行ずつ実行してみて、結果を比較されることをおすすめいたします:blush:


お役に立てましたら幸いです:bow:

3Like

Comments

  1. @takaekokaz

    Questioner

    @noritakaIzumiさま
    ご返信ありがとうございます。
    まだまだ初心者なので、とんちんかんなことを言うかもしれませんが、よろしくお願いします。

    取り急ぎ、
    >@takaekokaz 様が今回実行されたコードは、ファイルからの実行でしょうか?
    テキストエディタのIDLEからの実行です。
  2. いえいえ、こちらも Qiita への初めての回答でちゃんとしたことが言えるかどうか不安になっておりました。よろしくお願いいたします。

    テキストエディタのIDLEで実行であれば、ファイルの直接実行と基本的には同じかと思います。

    driver.find_element_by_id('f1').click() の部分なのですが、エラーになった部分は行数で示されることが多いので、 find_element_by_id の結果を一度変数に代入すると、後で原因解明がしやすくなるかと思います↓

    # 変数名は適宜
    target = driver.find_element_by_id('f1')
    target.click()
  3. @takaekokaz

    Questioner

    ありがとうございます。早速試してみます。
    ちなみに「ファイル選択」ボタンの右隣の「Upload」ボタンは
    driver.find_element_by_css_selector('input[type="submit"][value="Upload"]').click()
    にて取得し、クリックできるのですが、、。
  4. @takaekokaz

    Questioner

    @noritakaIzumiさま

    以下は実際に動かした私のコードです。
    コードの後「RESTART」からがトラックバックです。
    トラックバックによると、私のコードの★29行目でエラーが起こっているようです。

    from selenium import webdriver
    from selenium.common.exceptions import NoSuchElementException
    from urllib.parse import quote
    from bs4 import BeautifulSoup
    import requests
    import time as tm
    import sys



    url = 'http://_____'
    driver = webdriver.Chrome("C:\Program Files (x86)\chromedriver")
    driver.get(url)

    tm.sleep(1)

    driver.find_element_by_id("usrId").send_keys("divuser")
    driver.find_element_by_id("passWd").send_keys("divuser")
    tm.sleep(1)
    driver.find_element_by_id('submitbutton1').click()


    tm.sleep(1)
    driver.find_element_by_partial_link_text("select.").click()
    tm.sleep(1)
    driver.find_element_by_partial_link_text("download").click()
    tm.sleep(1)
    target = driver.find_element_by_id('f1')
    target.click() ←★29行目



    ============== RESTART: C:\Users\divusuers\Desktop\System login ver01.py =============
    Traceback (most recent call last):
    File "C:\Users\divusuers\Desktop\System login ver01.py", line 29, in <module>
    f1.click()
    File "C:\Users\divusuers\AppData\Local\Programs\Python\Python38-32\lib\site-packages\selenium\webdriver\remote\webelement.py", line 80, in click
    self._execute(Command.CLICK_ELEMENT)
    File "C:\Users\divusuers\AppData\Local\Programs\Python\Python38-32\lib\site-packages\selenium\webdriver\remote\webelement.py", line 633, in _execute
    return self._parent.execute(command, params)
    File "C:\Users\divusuers\AppData\Local\Programs\Python\Python38-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
    File "C:\Users\divusuers\AppData\Local\Programs\Python\Python38-32\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
    selenium.common.exceptions.InvalidArgumentException: Message: invalid argument
    (Session info: chrome=84.0.4147.135)
  5. @takaekokaz

    Questioner

    noritakaIzumiさま
    target = driver.find_element_by_id('f1')
    target.send_keys(ファイルのフルパス)
    にて無事、ファイルをアップロードすることができました。
    send_keysの情報を参考にさせてもらいました。
    ありがとうございました。

driver.find_element_by_id('f1') で input 要素は取得できているようです。問題の原因は、 type="file" の input 要素は元々 Selenium からクリックできないことです。ファイルを選択するには 取得した要素.send_keys(ファイルパス) とします。


@noritakaIzumi さんがコメントで同様の参考ページを提案されてましたね。横から失礼しました。

2Like

Comments

  1. @takaekokaz

    Questioner

    @uasiさま
    ありがとうございます。
    私の理解では、
    ・Seleniumでは、type="file"のinput要素のクリックは不可能。
    ・したがって、uploadしたいファイルのパスを取得はできている('f1')要素にsend_keys。コードに直すと、
    target = driver.find_element_by_id('f1')
    target.send_keys(ファイルのフルパス)

    ということであってますでしょうか?
  2. はい、そういうことです。
  3. @takaekokaz

    Questioner

    uasiさま
    target = driver.find_element_by_id('f1')
    target.send_keys(ファイルのフルパス)
    にて無事、ファイルをアップロードすることができました。
    Seleniumでクリックできないinput要素があるとは全く分かりませんでした。
    非常に勉強になりました。
    ありがとうございます。

Your answer might help someone💌