2016-08-28 12 views
0

だから、私は16歳で、Pythonには初めてです。私は私が学ぶのを助けるために行うために、プロジェクトを必要とするので、私はプロジェクトとしてプレイステーションプラスコードジェネレータで上がってきたこれまでのところそれがない:Selenium Pythonでバウチャーコード入力を自動化しようとしています

はソニーのサイト -Entersでアカウント管理へのコード -logsを-Generatesエラーが

voucher_box = driver.find_element_by_id("voucherCode") 
redeem_button = driver.find_element_by_id("redeemGiftCardButton") 
while i < amount: 
    voucher_box.clear() 
    currentcode = codegen.codegen() 
    voucher_box.send_keys(currentcode) 
    redeem_button.click() 
    if "The Prepaid Card code you entered is incorrect or is no longer valid" in driver.page_source: 
     print("Error found") 
    else: 
     print("Error not found") 
    i += 1 

を発生した場合にのみONCE行わ場合は、たとえば、私は2に金額を設定している場合、私は私のエラーメッセージ「エラーが見つかりました」を取得、完全に正常に動作し、それがクラッシュしたセクション -Checksを償還時のコードと私にこれを与える:

Traceback (most recent call last): 
    File "C:/Users/M4SS3CR3/PycharmProjects/UKP/main.py", line 38, in <module> 
    voucher_box.clear() 
    File "C:\Users\M4SS3CR3\AppData\Local\Programs\Python\Python35-32\lib\site-packages\selenium\webdriver\remote\webelement.py", line 87, in clear 
    self._execute(Command.CLEAR_ELEMENT) 
    File "C:\Users\M4SS3CR3\AppData\Local\Programs\Python\Python35-32\lib\site-packages\selenium\webdriver\remote\webelement.py", line 461, in _execute 
    return self._parent.execute(command, params) 
    File "C:\Users\M4SS3CR3\AppData\Local\Programs\Python\Python35-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 236, in execute 
    self.error_handler.check_response(response) 
    File "C:\Users\M4SS3CR3\AppData\Local\Programs\Python\Python35-32\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 192, in check_response 
    raise exception_class(message, screen, stacktrace) 
selenium.common.exceptions.StaleElementReferenceException: Message: Element not found in the cache - perhaps the page has changed since it was looked up 
Stacktrace: 
    at fxdriver.cache.getElementAt (resource://fxdriver/modules/web-element-cache.js:9454) 
    at Utils.getElementAt (file:///C:/Users/M4SS3CR3/AppData/Local/Temp/tmpn3rxlnty/extensions/[email protected]/components/command-processor.js:9039) 
    at fxdriver.preconditions.visible (file:///C:/Users/M4SS3CR3/AppData/Local/Temp/tmpn3rxlnty/extensions/[email protected]/components/command-processor.js:10090) 
    at DelayedCommand.prototype.checkPreconditions_ (file:///C:/Users/M4SS3CR3/AppData/Local/Temp/tmpn3rxlnty/extensions/[email protected]/components/command-processor.js:12644) 
    at DelayedCommand.prototype.executeInternal_/h (file:///C:/Users/M4SS3CR3/AppData/Local/Temp/tmpn3rxlnty/extensions/[email protected]/components/command-processor.js:12661) 
    at DelayedCommand.prototype.executeInternal_ (file:///C:/Users/M4SS3CR3/AppData/Local/Temp/tmpn3rxlnty/extensions/[email protected]/components/command-processor.js:12666) 
    at DelayedCommand.prototype.execute/< (file:///C:/Users/M4SS3CR3/AppData/Local/Temp/tmpn3rxlnty/extensions/[email protected]/components/command-processor.js:12608) 

ご不便をおかけして申し訳ございません。

+0

セレンはトリッキーです...言われているように、要素がページに見つからないため、クラッシュしているようです。ボタンをクリックした後にtime.sleep(3)を追加して十分なページを与えたい場合があります要素をリロードする時間... 1回の提出を行った後にページに実際にID voucherCodeが含まれていることを確認します。これをテストする簡単な理由は、クロムツールを使用して、ページの変更を手動で確認することです。html – reticentroot

+0

@reticentroot私は、あなたが言ったことの両方を試しました。 time.sleep()は、同じエラーを再び助けません。私も提出後に要素をチェックし、それはまだ同じIDとすべてです。 –

+0

i + 1の直後は、セレンがページ(driver.get())のページをリロードし、whileループ内でvoucher_box変数とredeem_button変数を移動させます。要素が毎回見つかるように。最終的には、try以外のtryループ内のすべてのものを、例外のパスまたは例外でブロックすることができます。 – reticentroot

答えて

1

これは>私はあなたがまた限りhtml.find(ID)のような何かをするように行くことができますコメント

while i < amount: 
    try: 
     counter = 0 
     # make sure that the elements can be found 
     # try ten times and then break out of loop 
     while counter < 10: 
     try: 
      voucher_box = driver.find_element_by_id("voucherCode") 
      redeem_button = driver.find_element_by_id("redeemGiftCardButton") 
      break 
     except: 
      time.sleep(1) 
      counter += 1 

     voucher_box.clear() 
     currentcode = codegen.codegen() 
     voucher_box.send_keys(currentcode) 
     redeem_button.click() 
     if "The Prepaid Card code you entered is incorrect or is no longer valid" in driver.page_source: 
      print("Error found") 
     else: 
      print("Error not found") 
     i += 1 
     driver.get("my page") # may not need this line because the elements were moved inside the while loop 
     time.sleep(3) # give the page enough time to load 
    except: 
     pass 

に言及したかのアイデアです-1:IDは、「何かをwasnありませんページ上に存在するので、終了またはリロードする。また、より多くの何か、それは、オブジェクトがeveryloopを通じて正しいオブジェクトであるので、ので、whileループ内

voucher_box = driver.find_element_by_id("voucherCode") 
      redeem_button = driver.find_element_by_id("redeemGiftCardButton") 

を移動するには、おそらく良いでしょう。起こっていることは、あなたが別のdomに属していた要素を使用しているということです。

+0

ありがとう、とてもうまくいった! –

関連する問題