iT邦幫忙

1

無法跳離迴圈(已解決)

  • 分享至 

  • xImage

做了一個程式想要實現自動登入,因此如果打錯驗證碼,程式就要自動重填。但在此程式中,如果驗證碼打對,程式便不再運行。

while True:
      if helium.Text("登入失敗!").exists:
          python_button = driver.find_elements_by_xpath("/html/body/center/h3[2]/input")[0]
          python_button.click()  
          helium.wait_until(helium.Text("請輸入驗證碼").exists)
          textfields = helium.find_all(helium.TextField())
          driver.save_screenshot("temp.png")
          img = cv2.imread("temp.png")
          x=1080
          y=290
          w=168
          h=50
          captcha=img[y:y+h, x:x+w]
          final_captcha=(pytesseract.image_to_string(yanjon(captcha)))
          final_captcha = final_captcha.replace(' ', '')
          final_captcha = final_captcha.replace('/', 'I')
          final_captcha = final_captcha.replace('.', '')
          final_captcha = final_captcha.replace(',', '')
          final_captcha = final_captcha.replace('|', 'I')
          final_captcha = final_captcha.replace('@', 'G')
          final_captcha = final_captcha.replace(')', 'j')
          final_captcha = final_captcha.replace(';', 'I')
          final_captcha = final_captcha.replace('\\', 'I')
          final_captcha = final_captcha.replace('*', 'P')
          final_captcha = final_captcha.replace('1', 'I')
          final_captcha = final_captcha.replace('2', 'Z')
          final_captcha = final_captcha.replace('6', 'G')
          final_captcha = final_captcha.replace('7', 'T')
          final_captcha = final_captcha.replace('-', '')
          final_captcha = final_captcha.replace('&', '')
          final_captcha = final_captcha.replace('!', 'I')
          final_captcha = final_captcha.replace('¥', 'Y')
          final_captcha = final_captcha.replace('0', 'O')
          final_captcha = final_captcha.replace('\'', '')
          if final_captcha=='':
              final_captcha=('ABCD')
          helium.write(account, into=textfields[2])
          helium.write(password, into=textfields[1])
          helium.write(final_captcha, into=textfields[0])
          python_button = driver.find_elements_by_xpath("/html/body/form/div/div[3]/div/div[5]/input")[0]
          python_button.click() 
      else:
         break
fillano iT邦超人 1 級 ‧ 2022-06-20 08:35:25 檢舉
...不然咧,程式不是你寫的嗎XD
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
海綿寶寶
iT邦大神 1 級 ‧ 2022-06-20 10:04:22
最佳解答
while True:
      if helium.Text("登入失敗!").exists:
          輸入驗證碼後按按鈕
      else:
          離開 while 迴圈

就程式碼看起來的邏輯是
由於「helium.Text 裡一直有 登入失敗! 的文字」而導致無窮迴圈

而程式裡在「輸入驗證碼後按按鈕」之後,可能有三種情形:
1.登入成功,沒有登入失敗文字
2.登入失敗,有登入失敗文字
3.登入成功,有登入失敗文字(helium 沒更新或其他原因)

猜測碰到的情形是 2 或 3
最笨又最簡單的方法就是把 helium.Text 顯示出來,以確定是否有「登入失敗!」文字

另外提個題外話
這裡用 while True 的方式可能不是很恰當
因為如果「輸入驗證碼因為任何原因而登入失敗」
那麼再怎麼重覆執行這段,也不會成功

Moofon iT邦新手 5 級 ‧ 2022-06-20 11:38:38 檢舉

我的程式理念大概如下

while True:
      if helium.Text("登入失敗!").exists:#如果輸入錯驗證碼,就會出現登入失敗!
          重新輸入驗證碼後按按鈕
      else:#如果沒有出現登入失敗,也就是說驗證碼輸入正確
          離開 while 迴圈

想問一下,helium假如接收到 登入失敗! 的文字,就會一直保留嗎,因為現在程式如果寫錯驗證碼的話的確可以重複填寫,但對了的話好像就會卡住,跑不出while迴圈

最笨又最簡單的方法就是把 helium.Text 顯示出來,以確定是否有「登入失敗!」文字

Moofon iT邦新手 5 級 ‧ 2022-06-20 18:57:50 檢舉

試了很久,最後發現是exist後面要加一個括弧

我要發表回答

立即登入回答