這里的文字 是有ID位置的,並且圖片是背景圖片,所以不需要圖片文字識別操作。
# -*- encoding=utf8 -*-
__author__ = "admin-fly"
from airtest.core.api import *
auto_setup(__file__)
from poco.drivers.android.uiautomation import AndroidUiautomationPoco
poco = AndroidUiautomationPoco(use_airtest_input=True, screenshot_each_action=False)
#poco(text="CF-MY-Sta").click()
stop_app('sta.onion.cosyfans')
start_app('sta.onion.cosyfans')
sleep(2)
poco("android.widget.ImageView").click()
poco("android.widget.ImageView").click()
sleep(1)
poco("android.widget.LinearLayout").offspring("android:id/content").offspring("sta.onion.cosyfans:id/nav_view").offspring("sta.onion.cosyfans:id/nav_mycosy").child("sta.onion.cosyfans:id/icon").click()
poco("sta.onion.cosyfans:id/btn_login").click()
poco("sta.onion.cosyfans:id/edit_phone").set_text("")
poco("sta.onion.cosyfans:id/edit_phone").set_text("191234000")
sleep(1)
poco("sta.onion.cosyfans:id/edit_pass").set_text("")
poco("sta.onion.cosyfans:id/edit_pass").set_text("qwe123")
a1=poco("sta.onion.cosyfans:id/tv_code").attr('text')
log("需要點擊得驗證碼得數值為:")
print(a1)
b1=poco("sta.onion.cosyfans:id/tv_code").get_text()
print(b1)
#獲取 待驗證的驗證碼 數字
V_code1=a1[1]
V_code2=a1[2]
V_code3=a1[3]
#需要點擊的驗證碼的數值
t01=poco("sta.onion.cosyfans:id/tv_code1").attr('text')
t02=poco("sta.onion.cosyfans:id/tv_code2").attr('text')
t03=poco("sta.onion.cosyfans:id/tv_code3").attr('text')
t04=poco("sta.onion.cosyfans:id/tv_code4").attr('text')
print(t01)
t1=t01[0]
t2=t02[0]
t3=t03[0]
t4=t04[0]
#拿第1個字符去跟圖片上的文字比較,匹配則 選中
if V_code1==t1:
poco("sta.onion.cosyfans:id/tv_code1").click()
elif V_code1==t2:
poco("sta.onion.cosyfans:id/tv_code2").click()
elif V_code1==t3:
poco("sta.onion.cosyfans:id/tv_code3").click()
else:
poco("sta.onion.cosyfans:id/tv_code4").click()
#拿第2個字符去跟圖片上的文字比較,匹配則 選中
if V_code2==t1:
poco("sta.onion.cosyfans:id/tv_code1").click()
elif V_code2==t2:
poco("sta.onion.cosyfans:id/tv_code2").click()
elif V_code2==t3:
poco("sta.onion.cosyfans:id/tv_code3").click()
else:
poco("sta.onion.cosyfans:id/tv_code4").click()
#拿第3個字符去跟圖片上的文字比較,匹配則 選中
if V_code3==t1:
poco("sta.onion.cosyfans:id/tv_code1").click()
elif V_code3==t2:
poco("sta.onion.cosyfans:id/tv_code2").click()
elif V_code3==t3:
poco("sta.onion.cosyfans:id/tv_code3").click()
else:
poco("sta.onion.cosyfans:id/tv_code4").click()
#登錄操作
poco("sta.onion.cosyfans:id/btn_login").click()
poco(text="My Cosy").click()
#驗證登錄是否成功
assert_exists(Template(r"tpl1620789782432.png", record_pos=(0.19, -0.867), resolution=(1080, 2160)), "以進入個人中心作為登錄得斷言結果")
上面的這些 因為是有ID位置的 並且是有文本文字的,它只是嵌入了背景圖片,所以不需要圖片文字識別,以上的方法就可以 直接 自動輸入登錄了!。。。。。。
關於嵌入圖片中的文字 識別的一些看法:
驗證碼本意是為了加強安全防控,規避惡意登錄。所以對於需要圖片識別的驗證碼 去識別破解,識別率不高。
PS:對於文字嵌入 圖片中,並且文字的位置是動態變化的 這種圖片文字識別驗證的話 存在一個識別率的問題,並且位置動態變化,識別這個定位也不准確。
在識別之前對圖片進行了 對比度、色彩度等加強處理,發現識別的效果也不明顯。
圖片識別采用了 百度雲API中的文字識別,基本每次只能識別2-3個文字, 我做了一個循環去識別也無法滿足要求,並且百度雲API請求次數還有限制。
如果非要利用圖片識別破解,那必須需要寫一個識別算法的方法,然后拿到原圖進行識別,並且為了提升識別率,再循環調用算法 匹配正確則停止調用。
這種圖片文字識別的 不好解決,只能通過 請求 登錄接口 進入系統主頁,拿到瀏覽器cookies信息,再刷新頁面,這樣進入系統主頁 繞過驗證碼。