Initial
This commit is contained in:
156
src_win/actions-iTunes-header/workflow_helper/itunes_auto_login.py
Executable file
156
src_win/actions-iTunes-header/workflow_helper/itunes_auto_login.py
Executable file
@@ -0,0 +1,156 @@
|
||||
import subprocess
|
||||
import time
|
||||
from pywinauto.application import Application
|
||||
from win32con import *
|
||||
import sys
|
||||
|
||||
ACCOUNT = sys.argv[1]
|
||||
PASSWORD = sys.argv[2]
|
||||
|
||||
print("Launching iTunes...")
|
||||
|
||||
def initITunes():
|
||||
subprocess.call('taskkill /f /im iTunes*', shell=True)
|
||||
|
||||
app = Application().start(r"C:\Program Files\iTunes\iTunes.exe")
|
||||
app.wait_cpu_usage_lower()
|
||||
time.sleep(8)
|
||||
|
||||
def debugTopWin():
|
||||
topwin = app.top_window().wait('exists')
|
||||
texts = []
|
||||
texts += topwin.texts()
|
||||
for c in topwin.iter_children():
|
||||
texts += c.texts()
|
||||
print("-- Cur top win: %s, texts: %s" % (topwin, texts))
|
||||
|
||||
def cleanAllDialog():
|
||||
while True:
|
||||
topwin = app.top_window().wait('exists')
|
||||
if 'Dialog' in topwin.class_name():
|
||||
print(" Closing dialog %s" % topwin.window_text())
|
||||
app.top_window().Button0.click()
|
||||
elif 'Tour' in topwin.window_text():
|
||||
print(" Closing Window %s" % topwin.window_text())
|
||||
topwin.close()
|
||||
else:
|
||||
break
|
||||
|
||||
app.wait_cpu_usage_lower()
|
||||
time.sleep(5)
|
||||
|
||||
# Click all first-time dialogs (like License Agreements, missing audios)
|
||||
cleanAllDialog()
|
||||
|
||||
# Calm down a bit before main window operations
|
||||
app.wait_cpu_usage_lower()
|
||||
debugTopWin()
|
||||
|
||||
# Click main window's first-time question ("No thanks" button)
|
||||
try:
|
||||
buttonText = app.iTunes.Button11.wait('ready').window_text()
|
||||
print('Button11 text is: %s' % buttonText)
|
||||
if 'Search' not in buttonText:
|
||||
print("Clicked 'No Thanks' Button!")
|
||||
app.iTunes.Button11.click_input()
|
||||
app.wait_cpu_usage_lower()
|
||||
time.sleep(4)
|
||||
else:
|
||||
raise Exception('stub')
|
||||
except:
|
||||
print("Not founding 'No Thanks' Button, passing on...")
|
||||
|
||||
|
||||
# Start logging in by clicking toolbar menu "Account"
|
||||
print("Clicking Account menu...")
|
||||
app.iTunes.Application.Static3.click()
|
||||
app.wait_cpu_usage_lower()
|
||||
time.sleep(3)
|
||||
|
||||
debugTopWin()
|
||||
|
||||
# Detect whether we have "&S" in popup, which refers to "Sign in"
|
||||
popup = app.PopupMenu
|
||||
if '&S' not in popup.menu().item(1).text():
|
||||
popup.close()
|
||||
raise Exception("Already logged in!")
|
||||
|
||||
print("Signin menu presented, clicking to login!")
|
||||
# not log in
|
||||
popup.menu().item(1).click_input()
|
||||
app.wait_cpu_usage_lower()
|
||||
time.sleep(8)
|
||||
debugTopWin()
|
||||
|
||||
for i in range(15):
|
||||
dialog = app.top_window()
|
||||
dialogWrap = dialog.wait('ready')
|
||||
assert dialogWrap.friendly_class_name() == 'Dialog'
|
||||
time.sleep(1.0)
|
||||
try:
|
||||
if dialogWrap.window_text() == 'iTunes' \
|
||||
and dialog.Edit1.wait('ready').window_text() == 'Apple ID' \
|
||||
and dialog.Edit2.wait('ready').window_text() == 'Password' \
|
||||
and dialog.Button1.wait('exists').window_text() == '&Sign In':
|
||||
break
|
||||
except Exception as e:
|
||||
continue
|
||||
else:
|
||||
raise Exception("Failed to find login window in 15 iterations!")
|
||||
app.wait_cpu_usage_lower()
|
||||
|
||||
print("Setting login dialog edit texts")
|
||||
|
||||
appleid_Edit = dialog.Edit1
|
||||
appleid_Edit.wait('ready')
|
||||
appleid_Edit.click_input()
|
||||
appleid_Edit.type_keys(ACCOUNT)
|
||||
appleid_Edit.set_edit_text(ACCOUNT)
|
||||
time.sleep(3)
|
||||
|
||||
pass_Edit = dialog.Edit2
|
||||
pass_Edit.wait('ready')
|
||||
pass_Edit.click_input()
|
||||
pass_Edit.type_keys(PASSWORD)
|
||||
pass_Edit.set_edit_text(PASSWORD)
|
||||
time.sleep(3)
|
||||
|
||||
print("Clicking login button!")
|
||||
loginButton = dialog.Button1
|
||||
loginButton.wait('ready')
|
||||
# click multiple times as pywinauto seems to have some bug
|
||||
loginButton.click()
|
||||
time.sleep(0.5)
|
||||
try:
|
||||
loginButton.click()
|
||||
time.sleep(0.5)
|
||||
loginButton.click_input()
|
||||
except:
|
||||
pass
|
||||
|
||||
|
||||
print("Waiting login result...")
|
||||
time.sleep(10)
|
||||
debugTopWin()
|
||||
|
||||
if app.top_window().handle == dialogWrap.handle:
|
||||
raise Exception("Failed to trigger Login button!")
|
||||
elif app.top_window().window_text() == 'Verification Failed':
|
||||
raise Exception("Verification Failed: %s" % app.top_window().Static2.window_text())
|
||||
|
||||
|
||||
# Finish & Cleanup
|
||||
print("Waiting all dialogs to finish")
|
||||
cleanAllDialog()
|
||||
|
||||
|
||||
for init_i in range(3):
|
||||
try:
|
||||
initITunes()
|
||||
break
|
||||
except Exception as e:
|
||||
print("Init iTunes %d: Failed with %s" % (init_i, e))
|
||||
import traceback; traceback.print_exc()
|
||||
time.sleep(8)
|
||||
|
||||
print("Init iTunes Successfully!")
|
||||
Reference in New Issue
Block a user