2017-03-28 7 views
-1

私は職場で使用しているいくつかのサイトから報告番号を収集するようwebdriversを設定しています。これらはすべてパスワードで保護されており、今まで問題にはなっていません。私はFirefoxでのPython 3.6とセレンwebdriverをを使用していますSelenium Webdriverが要素をクリックしていない

https://ssp.vertamedia.com/

:ここで私はと対話しようとしていますログイン画面があります。

このサイトでは、パスワード入力と送信ボタンが表示される前に、Webdriverがユーザー名を入力してから「次へ」ボタンと対話する必要があります。私はユーザー名を記入することができますが、これまで "次の"ボタンとやりとりするウェブドライバを手に入れることができませんでした。私は、クラス名、ID、およびCSSセレクタを使用してみましたが、これまで成功していない

<a class="x-btn attached-btn blue x-unselectable x-box-item x-btn-attached-btn-small x-item-disabled x-btn-disabled" style="height: 40px; right: auto; left: 282px; top: 0px; margin: 0px;" hidefocus="on" unselectable="on" role="button" aria-hidden="false" aria-disabled="true" id="button-1021" data-componentid="button-1021"> 
    <span id="button-1021-btnWrap" data-ref="btnWrap" role="presentation" unselectable="on" style="" class="x-btn-wrap x-btn-wrap-attached-btn-small "> 
     <span id="button-1021-btnEl" data-ref="btnEl" role="presentation" unselectable="on" style="height:auto;" class="x-btn-button x-btn-button-attached-btn-small x-btn-text x-btn-button-center "> 
      <span id="button-1021-btnIconEl" data-ref="btnIconEl" role="presentation" unselectable="on" class="x-btn-icon-el x-btn-icon-el-attached-btn-small " style=""></span> 
      <span id="button-1021-btnInnerEl" data-ref="btnInnerEl" unselectable="on" class="x-btn-inner x-btn-inner-attached-btn-small">next</span> 
     </span> 
    </span> 
</a> 

:以下

は、サイトからのボタンのHTMLスニペットです。以下はPythonのスニペットがある:それは私がパスワードを入力していますpassElement部分に当たったとき

def exe(self): 
    browser = webdriver.Firefox() 
    wait = WebDriverWait(browser, 15) 
    yesterday = date.today() - timedelta(1) 
    browser.get("https://ssp.vertamedia.com") 

    try: 
     userElement = wait.until(EC.visibility_of_element_located((By.ID,'textfield-1020-inputEl'))) 
     userElement.send_keys(self.cred.pop('User')) 
     browser.find_element_by_id('button-1021').click() 
     passElement = wait.until(EC.visibility_of_element_located((By.ID, 'textfield-1027-inputEl'))) 
     passElement.send_keys(self.cred.pop('Password')) 
     browser.find_element_by_id('button-1028').click() 

    except TimeoutException: 
     self.cred['Impression'] = "Login error" 
     self.cred['Revenue'] = "Login error" 
     self.cred['Date'] = yesterday.strftime('%m%d%y') 

は基本的に、それは誤り「要素が表示されていない」ヒット。

次のボタンとやりとりする方法についてのご意見をお待ちしております。

+0

ユーザー名を設定してからもう少し寝たことがありますか? – kevin628

答えて

0

あなたはtime.sleep()を使用して回避し、一定の条件がさらに進む前に発生するため、あなたが待ってみましょうどのWebDriverWaitを使用する必要があります。

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

def exe(): 
    browser = webdriver.Firefox() 
    wait = WebDriverWait(driver, 10) 
    browser.get("https://ssp.vertamedia.com") 
    try: 
     userElement = browser.find_element_by_id('textfield-1020-inputEl') 
     userElement.send_keys(self.cred.pop('User')) 
     browser.find_element_by_id('button-1021').click() 
     passElement = wait.until(EC.visibility_of_element_located((By.ID,'textfield-1027-inputEl')) 
     passElement.send_keys(self.cred.pop('Password')) 
     browser.find_element_by_id('button-1028').click() 
     time.sleep(10) #Change this to WebDriverWait as well 

あなたはセレンについての詳細を学ぶことができ、ここで待機します:http://selenium-python.readthedocs.io/waits.html

+0

ありがとうSDBot、私は待機セクションへのリンクを感謝し、これは私が設定した他のすべてのドライバを改善しました。私が今起こっていることは、タイムアウトしているということです。 何らかの理由で、次のボタンで「クリック」していません。サンプルのユーザー名は、[email protected]です。私はclick()の他にページとやりとりする良い方法があるのだろうかと思っています – Andrew

+0

@Andrewはまだ解決されていない問題ですか?あなたはjavascriptを使用することができます: 'browser.execute_script(" document.getElementById( 'button-1028-btnInnerEl')。click() ")'また、期待した条件 'element_to_be_clickable'を使って試しましたか? – SDBot

+0

私はelement_to_be_clickableと他のいくつかの予想される条件を試しました。私はそれをwait()とtime.sleep()の組み合わせで確実に動作させることができました。 – Andrew

0

もう一度SDBotにwait()のヘルプをありがとうございます。

この特定のサイトでは、何か変わったことが起こり、ドライバは「次の」ボタンが表示され、クリックされる準備ができていることを伝えることができません。 「ログイン」ボタンでも同じことが起こります。私は、ユーザー名とログインの間にもう一度time.sleep()を挿入することによって、それを動作させることができました。私はいくつかの異なる期待された条件を試しましたが、それを動作させることができませんでした。 http://selenium-python.readthedocs.io/api.html?highlight=expected%20conditions#selenium.webdriver.support.expected_conditions.frame_to_be_available_and_switch_to_it

def exe(self): 
    browser = webdriver.Firefox() 
    wait = WebDriverWait(browser, 15) 
    yesterday = date.today() - timedelta(1) 
    browser.get("https://ssp.vertamedia.com") 

    try: 
     userElement = wait.until(EC.visibility_of_element_located((By.ID,'textfield-1020-inputEl'))) 
     userElement.send_keys(self.cred.pop('User')) 
     time.sleep(# insert seconds) 
     wait.until(EC.visibility_of_element_located((By.ID,'button-1021-btnInnerEl'))).click() 
     passElement = wait.until(EC.visibility_of_element_located((By.ID, 'textfield-1027-inputEl'))) 
     passElement.send_keys(self.cred.pop('Password')) 
     time.sleep(# insert seconds5) 
     wait.until(EC.visibility_of_element_located((By.ID,'button-1028'))).click() 

    except TimeoutException: 
     self.cred['Impression'] = "Login error" 
     self.cred['Revenue'] = "Login error" 
     self.cred['Date'] = yesterday.strftime('%m%d%y') 
関連する問題