0

this siteにログインしようとしています。しかし、私はユーザー名でテキストボックスを埋めることさえできません。クリックするまで隠れたテキストボックスにキーストロークを送信するには?

私が試した:

  • 暗黙的および明示的な待機

    ユーザ名が内に封入されたテキストボックスの

構造のJavaScript

を実行

  • をタグで、width属性を使用して検索できます。テキストボックス自体は2つのinputタグで表されます。最初のものは隠されています。どちらも属性がstyleです。最初の値の初期値はdisplay: none;で、テキストボックスをクリックするとdisplay: inline-block;に変更されます。また、2番目の入力タグのstyle属性はdisplay: none;に設定されています。ユーザー名テキストボックスのフォーカスが失われると、これらの両方がトグルされます。 Iは、暗黙的および明示的の両方待機を使用してみました

    待機

    。明示的な待機を実装するコードがTimeoutExceptionエラーが発生しました:

    JavaScriptの

    を実行

    wait = WebDriverWait(driver, 10) 
    elem_username = wait.until(EC.visibility_of_element_located((By.ID, 'txt_username'))) 
    

    どちらinputタグがonfocusonchange属性を持っています。私は後者について気にしなかった(私の目標は、テキストボックスにキーストロークを最初に取得することだった)。 onfocusの値はSetEnd(this)です。だから私はそれを実行しようとしました。

    問題は、JavaScriptの実行に役立つドキュメントが見つかりませんでした。だから私はStackOverflowでいくつかの関連する答えをここで見た。私はこれを最初に試しました:

    elem_username = driver.find_element_by_id('txt_username') 
    driver.execute_script('SetEnd(this)') 
    

    私は要素に言及していなかったので、もちろん、私はそれが動作しないことを知っていた。だから、もう少し質問を閲覧した後、私はexecute_scriptが引数を取ったことを知りました。だから私は、スクリプトのようなものは、このようには機能しなかったと述べたエラーが発生したコードを、修正:

    driver.execute_script('arguments[0].SetEnd(this)', elem_username) 
    

    その後、私はexecute_script内の「クリックを()」を使用して答えを見ました。だから、私もそれを試しました:

    driver.execute_script('arguments[0].click()', elem_username) 
    

    「クリック()」は、ボタンのみたいです。しかし、私は、テキストボックスにフォーカスを移すために「クリック」しなければならないので、それはうまくいくと思いました。それはしませんでした。

    これは例外なく、ElementNotInteractableExceptionエラーを上げるまま、私は私の試みの全てで実行された最後の行、次のとおりです。

    elem_username.send_keys('blahblahblah') 
    

    要件

    Q &として、このサイト上だろう私がもう少し経験があれば、もちろん、優れているでしょう。たとえば、明示的な待機を示すいくつかの回答がありますが、そのほとんどはOPの問題を解決することを目的としていたため、関連するコード部分のみが含まれていました。私がそれらを理解するのは難しかったです。

    私はこの問題(サイトにログインしています)を解決したいと思いますが、はセレンを正しく学習することを願っています。以前はJavaなど他の言語でもそれを扱っていませんでした。公式文書はいいですが、私はそれを使ってこの問題を解決することができませんでした。だから私はより初心者にやさしいチュートリアルが欲しい。

  • 答えて

    1

    これが私の仕事:

    # Force the element to be displayed (noticed style.display = "none") 
    # Yes, I know you can see it, but selenium thinks it's not displayed. 
    driver.execute_script('document.getElementsByName("txt_username")[0].style.display="block"') 
    
    elem_username.send_keys('your name') 
    
    +0

    私にとってもうまくいった。なぜ2つのテキストボックスが表示されるのか考えていますか? https://imgur.com/a/yWcYb – Mahesh

    +0

    舞台裏でどのようなスタイリングが使用されているのかわかりません。また、インタラクティブなjavascriptコードが要素に対して何をしているのかよくわかりません。それは、オブジェクトのミラーが表示されることは奇妙に見えます。ページソースに重複エントリが表示されません。 –

    +0

    あなたのソリューションはこの問題を解決しました。しかし、私が質問したように、私はこれを正しい方法で学びたいと思っています。どうすればいいのか教えてください。 – Mahesh

    1

    だからあなたも、すべてを概説しました、あなたはそれをよく理解しているように見えます。そのトリックは、最初にinputをクリックしてから、最初にinputにキーを送信することです。 (私は、含まれているtdもChromeのために働いていたが、ブラウザはその面で異なり、このページの目的はあなたが2番目の入力をクリックしていることだった)。簡単な解決策は次のとおりです。

    real, readonly = driver.find_elements_by_css_selector("input[onfocus*='SetEnd']") 
    readonly.click() 
    real.send_keys('hi') 
    

    ご質問がありましたら、お手伝いできます。

    +0

    それはうまくいった。私はまだセレンを適切に扱うことを学ぶ方法を探しています。それは私があなたの答えのいずれかを受け入れなかった理由です。私はそれらをupvotedしましたが、彼らは私の一時的な問題だけを解決します。 – Mahesh

    +0

    私はメタサイト上のいくつかの記事を見て、私が "チュートリアル"を要求していないことが分かったので、私はRonの答えを受け入れました。だから、この特定の問題が解決されて以来、この質問には開かれたままの目的はあまりありませんでした。 – Mahesh

    関連する問題