做了一個程式想要實現自動登入,因此如果打錯驗證碼,程式就要自動重填。但在此程式中,如果驗證碼打對,程式便不再運行。
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
while True:
if helium.Text("登入失敗!").exists:
輸入驗證碼後按按鈕
else:
離開 while 迴圈
就程式碼看起來的邏輯是
由於「helium.Text 裡一直有 登入失敗! 的文字」而導致無窮迴圈
而程式裡在「輸入驗證碼後按按鈕」之後,可能有三種情形:
1.登入成功,沒有登入失敗文字
2.登入失敗,有登入失敗文字
3.登入成功,有登入失敗文字(helium 沒更新或其他原因)
猜測碰到的情形是 2 或 3
最笨又最簡單的方法就是把 helium.Text 顯示出來,以確定是否有「登入失敗!」文字
另外提個題外話
這裡用 while True 的方式可能不是很恰當
因為如果「輸入驗證碼因為任何原因而登入失敗」
那麼再怎麼重覆執行這段,也不會成功