2017-10-15 5 views
0

私はウェブサイトにログインしてボタンをクリックするスクリプトを作成しています。ウェブサイトのターゲット動的ID

私は以前これを行っていましたが、このウェブサイトでは動的IDを持っているようで、フィールドを見つけるのは難しいようです。ページを更新すると、IDは変更されますが、変更されないテキストがいくつかあります。

私はChromeとFirefoxを試しました。両方とも同じことをします。

このページ

https://www.quora.com/ 

driver.find_element_by_name("email") 

driver.find_elements_by_xpath( '// * [(@id、 "電子メール")が含ま]')である。send_keys( 'SSSS')

<input class="text header_login_text_box ignore_interaction" name="email" tabindex="1" data-group="js-editable" placeholder="Email" w2cid="IDHg1fF" id="__w2_IDHg1fF_email" type="text"> 
<input class="text header_login_text_box ignore_interaction" name="password" tabindex="2" data-group="js-editable" placeholder="Password" w2cid="IDHg1fF" id="__w2_IDHg1fF_password" type="password"> 

どのようにこれらの2つのフィールドをターゲティングできますか?彼らはIDの末尾にテキストを持っています。その数は変化し続ける。

+0

名前識別子を使用してみてください: 'driver.find_element_by_name(" email ")' –

+0

はい、既に使用していますがブラウザは終了しています。フィールドを入力しないでください –

+0

ページのURLを共有できますか? – Andersson

答えて

1

問題は、ロケータに一致する2つの要素があり、最初の要素が表示されないことです。これを処理するにはいくつかの方法があります。

  1. 使用2 1

    driver.find_elements_by_name("email")[1].send_keys() 
    
  2. ロケータと一致する要素の完全なリストを取得し、唯一の可視1

    emails = driver.find_elements_by_name("email") 
    email = next(element for element in emails if element.is_displayed()) 
    email.send_keys() 
    

秒にリストをフィルタリング1つはおそらくより良いアプローチ...より脆弱ではありません。

ヒント...この問題を回避する簡単な方法は、ブラウザでロケータをテストすることです。 Chromeでページを開き、開発ツールバーを開きます。 CSSセレクタをテストするには$$()を使用します。 $$("input[name='email']")。 XPathをテストするには、$x()を使用します。 $x("//input[@name='email']")。これを入力すると、そのロケータに一致する要素の数が返されます。複数ある場合は、コレクションを展開し、探しているものがページ上に点灯するまで、それぞれをホバーします。あなたが探しているものがあればそれはあなたに伝えられます。そのロケータを使用するか、別のものを使用するかを決定できます。これは、コードに入れる代わりにページを出る前に正しいロケータを識別し、失敗したことを見つけるためだけに実行し、別のものを試してみるのに役立ちます。それは、反復間の時間を大幅に削減します。

-1

これはあまり安定した方法ではありませんが、今はうまくいきます。

#Find all input elements  
inp=driver.find_elements_by_tag_name('input') 
#Sending keys to Email field 
inp[5].send_keys('Your login name') 
#Sending keys to Password field 
inp[6].send_keys('Password') 
#Click on login button 
inp[7].click() 
+0

うわー..本当にうまくいった。それはボタンをクリックしませんが、フォームを埋める...あなたは変数に挿入...しかし、私は入力[4]意味を知りたいのですか?このように多くのフィールドをどのようにターゲットできますか?あなたは説明することができます..このpythonは奇妙です –

+0

フォームが変更されると、あなたのスクリプトが壊れるので、それは良いアプローチではありません。要素を見つけるためにインデックスを使用しないでください。 – JeffC

関連する問題