2012-01-12 13 views
14

入力(タイプ=ボタン)を送信しようとしていますが、値を更新できません。 何か助けていただければ幸いです。 あなたの参照のために以下のテストケースを添付しました。 CLICKためPythonバインディングを使用すると、Selenium WebDriverのclick()が動作しないことがあります。

検索はここ

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import Select 
from selenium.common.exceptions import NoSuchElementException 
import unittest, time, re,datetime,os,sys 

from selenium.webdriver.common.keys import Keys 
from selenium.webdriver.common.action_chains import ActionChains 


def is_element_present(inst,selector,value): 
    try: 
     inst.find_element(by=selector, value=value) 
     return True 
    except: 
     return False 



class Testing(unittest.TestCase): 
    def setUp(self): 
     self.driver = webdriver.Chrome() 
     self.driver.implicitly_wait(5) 
     self.base_url = "http://new.ossmoketest.appspot.com/" 
     self.verificationErrors = [] 

    def test_ing(self): 
     try: 

      driver = self.driver 
      driver.get(self.base_url + "/Apab4b39d4_09d7_11e1_8df9_139372201eeb/1/signin?forward=/%3F") 
      now = datetime.datetime.now() 
      start = time.clock() 

      for i in range(5000000): 
       try: 
        if is_element_present(driver,By.ID,"userid"): break 
       except: pass 
      else: self.fail("time out") 
      end = time.clock() 
      diff = end - start 
      print diff 
      driver.find_element_by_id("userid").clear() 
      driver.find_element_by_id("userid").send_keys("[email protected]") 
      driver.find_element_by_xpath("//input[@src='/static/images/signup.png']").click() 
      print 'finished' 
      start = time.clock() 

      for i in range(5000000): 
       try: 
        if is_element_present(driver,By.LINK_TEXT,"Logout"): break 
       except: pass 
      else: self.fail("time out") 
      end = time.clock() 
      diff = end - start 
      print diff 
      time.sleep(5) 

      start = time.clock() 
      name = "smoketest"+ str(now.minute) +str(now.second) 
      for i in range(5000000): 
       try: 
        if is_element_present(driver,By.LINK_TEXT,"PurchaseOrder"): break 
       except: pass 
      else: self.fail("time out") 
      end = time.clock() 
      diff = end - start 
      driver.find_element_by_link_text('PurchaseOrder').click() 
      name = "smoketest"+ str(now.minute) +str(now.second) 
      start = time.clock() 
      for i in range(5000000): 
       try: 
        if is_element_present(driver,By.ID,"Customer_Name"): break 
       except: pass 
      else: self.fail("time out") 
      end = time.clock() 
      diff = end - start 

      newproduct = "rexona"+ str(now.minute) +str(now.second) 
      newprice = str(now.minute) +str(now.second) 
      newprice = float(newprice) 
      print newprice 
      driver.find_element_by_xpath("//input[starts-with(@id,'New_Product')]").send_keys(newproduct) 
      driver.find_element_by_xpath("//input[starts-with(@id,'Price')]").clear() 
      time.sleep(3) 

      driver.find_element_by_xpath("//input[starts-with(@id,'Price')]").send_keys(Keys.CONTROL+'a'+Keys.NULL, str(newprice)) 
      Mouse_cntrl = ActionChains(driver) 
      Mouse_cntrl.release(driver.find_element_by_xpath("//input[starts-with(@id,'Price')]")) 
      value = newprice 
      print value 
      time.sleep(2) 
      print 'start' 
      print driver.find_element_by_xpath("//input[starts-with(@id,'NewItem_NewItem')]").get_attribute('data-id') 
      # ------------------------CLICK FAILS HERE ------------------------------ 
#   driver.find_element_by_xpath("//input[starts-with(@id,'NewItem_NewItem')]").click() 
#   driver.find_element_by_xpath("//input[starts-with(@id,'NewItem_NewItem')]").submit() 
      driver.find_element_by_xpath("//input[starts-with(@id,'NewItem_NewItem')]").send_keys(keys.ENTER) 
#   Mouse_cntrl.double_click(driver.find_element_by_xpath("//input[starts-with(@id,'NewItem_NewItem')]")) 
      for i in range(10): 
       try: 
        print driver.switch_to_alert().text 
        if driver.switch_to_alert(): 
         driver.switch_to_alert().accept() 
         break 
       except: pass 
       time.sleep(1) 
      else: 
       print "alert not found" 
      print 'finished -- ' 
      time.sleep(8) 
      driver.find_element_by_xpath("//input[starts-with(@id,'Product')]").click() 
      arg = newproduct 
      print 'end' 
      for i in range(60): 
       try: 
        if is_element_present(driver,By.LINK_TEXT,arg): break 
       except: pass 
       time.sleep(1) 
      else: self.fail("time out") 
    #  sel.mouse_over("//html/body/ul/li/a[.=\""+arg+"\"]") 
      driver.find_element_by_link_text(arg).click() 
      start = time.clock() 
      time.sleep(25) 
      for i in range(1000000): 
       try: 

        if newprice == float(driver.find_element_by_id('Unit_Price').text): 
         end = time.clock() 
         diff = end - start 
         log.log(module='Smoke',testcase='Action New', result='Pass',time_taken= diff) 
         break 
       except: pass 
      else: 
       log.log(module='Smoke',testcase='Action New', result='Fail') 
       self.fail('New Failure') 
      log.log(module='Smoke',testcase='On Submit', result='Pass',time_taken= diff) 
      driver.find_element_by_id('Quantity').send_keys(Keys.CONTROL+'a'+Keys.NULL,"1") 
      time.sleep(5) 
      start = time.clock() 
      for i in range(1000000): 
       try: 
        if value == float(driver.find_element_by_id('Unit_Price').text): 
         end = time.clock() 
         diff = end - start 
         log.log(module='Smoke',testcase='Multiply', result='Pass',time_taken= diff) 
         break 
       except: pass 
      else: self.fail("time out") 
      for i in range(1000000): 
       try: 
        if value == float(driver.find_element_by_id('Amount').text): 
         end = time.clock() 
         diff = end - start 
         log.log(module='Smoke',testcase='DSUM with Parent', result='Pass',time_taken= diff) 
         break 
       except: pass 
      else: 
       end = time.clock() 
       diff = end - start 
       log.log(module='Smoke',testcase='DSUM with Parent', result='Fail',time_taken= diff) 
       self.fail("time out") 

     except: 
      self.driver.quit() 
      e = sys.exc_info()[1] 
      print str(e) 

    def tearDown(self): 
     self.driver.quit() 
     self.assertEqual([], self.verificationErrors) 

if __name__ == "__main__": 
    unittest.main() 

に失敗それは私の仕事のために致命的となっています。どんな助けもありがたいです。ありがとう

+0

コードはどの行で失敗していますか? – Julian

+2

CSSセレクタについてどのような:。 'driver.find_element_by_css_selector( "入力[ID * = NewItem_NewItem]")をクリックします()' また、このラインはあなたの属性を与えるのでしょうか? '' print driver.find_element_by_xpath( "// input [starts-with](@ id、 'NewItem_NewItem')]」)。get_attribute( 'data-id')' もしそうなら、ページロード後にjavascriptが実行されていますか?この要素に影響している可能性がありますか? –

+0

この要素は、ページの書き換えの結果として、何らかの形でクリックのために「準備ができていません」と思われます。理由を特定し、その状態が続く間、またはタイムアウトが発生するまでループします。 –

答えて

0

classNamecssSelectorまたは何かのような他の要素ファインダーを試してみます。要素が見つからない場合、xPathは時々エラーを出力しません。 まず、webdriverによって要素が実際に見つかったかどうかを調べることから始めます。

また、clickを試してみるか、他のコマンドを2度続けてという行を使用することもできます。これはすでにこのような問題のいくつかを解決しました。

11

.click()の代わりに試してみることもできます。 send_keys("\n")であり、これは「要素に注目しながら入力を押す」と同等である。

ので、この:私もこの問題を抱え

driver.find_element_by_link_text('PurchaseOrder').send_keys("\n") 
3

driver.find_element_by_link_text('PurchaseOrder').click() 

は、このなります。 ときどき、何らかの理由でwebdriverがボタンをクリックしなかった。ボタンを見つけることができました(NoSuchElementExceptionをスローしなかったし、WebDriverWaitが役に立たなかった)。

ボタンを2回クリックしたときの問題は、最初のクリックが成功した場合、2番目のクリックが失敗することです(または一致した場合は次のページの送信ボタンをクリックします)。私の最初の試みは2回目のクリックをtry/exceptブロックに置くことでした - これは私が次のページでsubmitをクリックしたことを発見した方法です。 XDそして2番目のボタンが見つからなかったときにテストを本当に遅くしました。

Selenium 2.0b3 IE WebDriver, Click not firingで良い洞察を見つけました。基本的に、親要素を最初にクリックします。これは一見何もしません。次に、送信ボタンをクリックします。

6

コードが正しいことを確認した場合(エラーなどでレビューしたことがあります)、まだfind_element_by_...('text').click()の機能が正しく動作していないことが確認された場合は、 JavaScriptがページを更新する前にコードが実行され続けます。スリープタイマーの期間はあなたが選ぶものは何でもすることができ

time.sleep(2) 

簡単な解決策はすぐに任意のclick()方法の後に以下のコードを挿入しimport timeにあります。私の場合、私は2秒を使いました。うまくいけば助けてくれます。

+2

これをしないでください。静的な睡眠でテストケースを汚染するよりも良い方法があります –

+0

私はこれが推奨されないことを認識していますが、私にとってはうまくいっています。 –

+0

静的な眠気はひどいです。適切な方法を待つ方法を学ぶ。 – Moser

0

click()の要素がURLである場合。私は、hrefプロパティを取って、driver.get(elem.get_attribute('href'))を使うことが最もクリーンであることを発見しました。