以前美団をやっていて水滴がたくさん溜まってしまったので、一気に使い切りたいと思い、手動で水やりするのは手間がかかりすぎるので、学んで楽しむという気持ちで自動水やりを書きました。
- Meituan を開き、コマンド ラインで adb shell dumpsys window | findstr mCurrentFocus と入力して、パッケージ名とアクティビティを取得します。
C:\Users\mmm>adb shell dumpsys window | findstr mCurrentFocus
mCurrentFocus=Window{
687f65d u0 com.sankuai.meituan/com.meituan.android.pt.homepage.activity.MainActivity}
- 関連情報を設定し(パッケージ名とアクティビティ以外は同じなのでコードは貼りません)、プロトコルとポップアップウィンドウを共通で閉じる判定を書き、初めて入力する場合はポップアップウィンドウは表示されません
# 协议同意复选框
def check_agreeBtn(self):
logging.info("======check_agreeBtn======")
try:
agreeBtn = self.driver.find_element(*self.agree)
except NoSuchElementException:
logging.info("no_agreeBtn")
else:
agreeBtn.click()
# 位置获取弹窗
def check_pop_window(self):
logging.info("======pop_window======")
try:
pop_window = self.driver.find_element(*self.no_reminder)
close_window_button = self.driver.find_element(*self.close_window)
except NoSuchElementException:
logging.info("no_pop_window")
logging.info("close_window_button")
else:
pop_window.click()
close_window_button.click()
3. ログインの場合、美団が意図的に制限を加えている可能性があり、一部のページ要素は uiautomatorview では取得できません。取得可能な要素は ID 配置を使用し、取得できない要素は最も推奨されない配置方法「座標配置」を使用します。
class LogIn(Common):
password_login = (By.ID, 'com.sankuai.meituan:id/user_password_login') # 密码登录
input_phone = (By.ID, 'com.sankuai.meituan:id/passport_mobile_phone') # 输入手机号
input_password = (By.ID, 'com.sankuai.meituan:id/edit_password') # 输入密码
check_agree = (By.ID, 'com.sankuai.meituan:id/passport_account_checkbox') # 协议复选框
ok_button = (By.ID, 'com.sankuai.meituan:id/login_button') # 确定按钮
# 登录
def Log_in(self, phone, password, *loc):
logging.info('======check_agreeBtn======')
self.check_agreeBtn() # 点击同意
self.check_pop_window() # 关闭获取位置权限弹窗
logging.info("=====login======")
self.driver.tap([(900, 2244), (1048, 2244)], 500) # 点击立即登录按钮
4. ログイン アカウントとパスワードは、セキュリティを確保し、後でアカウントのパスワードを変更するのがより便利になるようにデータによって駆動されます。
logging.info("=====password_login======")
self.driver.find_element(*self.password_login).click() # 选择密码登录
self.driver.find_element(*self.input_phone).send_keys(phone) # 输入手机号
self.driver.find_element(*self.input_password).send_keys(password) # 输入密码
self.driver.find_element(*self.check_agree).click() # 协议复选框
self.driver.find_element(*self.ok_button).click() # 确定按钮
5.散水方法は以前と同じですが、見つからない場合は、座標を使用して場所を特定し、繰り返し散水アクションを追加します。初めて座標位置決めクリックサイクルを書いたとき、通常のサイクルと同じだと思っていましたが、常にエラーが報告されました。この問題を解決する情報を検索した結果、bat ファイルに座標を記述し、クリックして開く操作が必要になりますが、この方法で記述すると、開くたびにデスクトップに dos コマンドのようなウィンドウが点滅するという欠点があります。
def watering(self):
path = r'D:/meituan_ui/dianji.bat'
for i in range(1, 20):
sleep(2)
os.startfile(path)
# dianji.bat文件内容为:adb shell input tap 950 1990 (后面两数字为坐标)
6. ログイン部分はアカウント番号に関係するため、ここでは表示されません 最後に、自動水やり効果を見てみましょう
自動水やり