Skip to content

Commit f988b2a

Browse files
Merge pull request #22 from LeithMerrifield/adaptive-wait-time
Adaptive wait time
2 parents 9ae8b17 + 92f4c48 commit f988b2a

File tree

5 files changed

+82
-116
lines changed

5 files changed

+82
-116
lines changed

Autoscanner.spec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ a = Analysis(
88
['Main.py'],
99
pathex=[],
1010
binaries=[],
11-
datas=[('src/kv/','./src/kv/'),('src/images/','src/images/'),('src/settings.json','src/'),('src/versions.json','src/')],
11+
datas=[('src/kv/','./src/kv/'),('src/images/','src/images/'),('src/settings.json','src/'),('src/versions.json','src/'),('src/elements.json','src/')],
1212
hiddenimports=[],
1313
hookspath=[],
1414
hooksconfig={},

src/Elements.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ def assign_ui_elements(self, dict):
3131
self.elements["NETSUITE_ENVIRONMENT"][0],
3232
self.elements["NETSUITE_ENVIRONMENT"][1],
3333
)
34+
self.LASTSESSIONBUTTON = (
35+
self.elements["LASTSESSIONBUTTON"][0],
36+
self.elements["LASTSESSIONBUTTON"][1],
37+
)
3438
self.WMS = (self.elements["WMS"][0], self.elements["WMS"][1])
3539
self.WAREHOUSE = (self.elements["WAREHOUSE"][0], self.elements["WAREHOUSE"][1])
3640
self.PICKING = (self.elements["PICKING"][0], self.elements["PICKING"][1])
@@ -75,6 +79,10 @@ def assign_ui_elements(self, dict):
7579
self.elements["QUANTITYINPUT"][0],
7680
self.elements["QUANTITYINPUT"][1],
7781
)
82+
self.QUANTITYBUTTON = (
83+
self.elements["QUANTITYBUTTON"][0],
84+
self.elements["QUANTITYBUTTON"][1],
85+
)
7886
self.NEXTPICKTASK = (
7987
self.elements["NEXTPICKTASK"][0],
8088
self.elements["NEXTPICKTASK"][1],
@@ -83,6 +91,10 @@ def assign_ui_elements(self, dict):
8391
self.elements["STATIONINPUT"][0],
8492
self.elements["STATIONINPUT"][1],
8593
)
94+
self.STATIONBUTTON = (
95+
self.elements["STATIONBUTTON"][0],
96+
self.elements["STATIONBUTTON"][1],
97+
)
8698
self.NEXTORDERBUTTON = (
8799
self.elements["NEXTORDERBUTTON"][0],
88100
self.elements["NEXTORDERBUTTON"][1],

src/MainWebDriver.py

Lines changed: 65 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ def __init__(self) -> None:
5858
self.state = State()
5959
self.driver = None
6060
self.continue_program = True
61-
self.pick_delay = 1.5
61+
self.pick_delay = 1
6262
self.elements = ElementClass()
6363
self.check_if_elements_exist()
6464

@@ -119,65 +119,72 @@ def pick(self, order):
119119
sleep(1)
120120
try:
121121
while True:
122-
sleep(self.pick_delay)
123-
WebDriverWait(self.driver, TIMOUT).until(
124-
EC.element_to_be_clickable(self.elements.FIRSTENTRY)
125-
).click()
126-
sleep(self.pick_delay)
127-
WebDriverWait(self.driver, TIMOUT).until(
128-
EC.element_to_be_clickable(self.elements.BINNUMBER)
129-
).click()
130-
sleep(self.pick_delay)
131-
WebDriverWait(self.driver, TIMOUT).until(
132-
EC.element_to_be_clickable(self.elements.ITEMNUMBER)
133-
).click()
134-
sleep(self.pick_delay)
122+
self.try_click_element(self.elements.FIRSTENTRY)
123+
self.try_click_element(self.elements.BINNUMBER)
124+
self.try_click_element(self.elements.ITEMNUMBER)
135125

136-
amount = self.driver.find_element(
137-
self.elements.QUANTITYAMOUNT[0], self.elements.QUANTITYAMOUNT[1]
138-
).text.split(" ")[0]
139-
amount += "\n"
140-
sleep(1)
141-
WebDriverWait(self.driver, TIMOUT).until(
142-
EC.element_to_be_clickable(self.elements.QUANTITYINPUT)
143-
).send_keys(amount)
126+
amount = self.try_return_text_element(
127+
self.elements.QUANTITYAMOUNT
128+
).split(" ")[0]
144129

145-
sleep(self.pick_delay)
130+
self.try_send_keys_element(self.elements.QUANTITYINPUT, amount)
131+
self.try_click_element(self.elements.QUANTITYBUTTON)
146132

147-
mark = self.driver.find_element(
148-
By.XPATH, "/html/body/div/div/div[1]/div[2]/div[1]"
133+
mark = self.try_return_text_element(
134+
(By.XPATH, "/html/body/div/div/div[1]/div[2]/div[1]")
149135
)
150136

151-
print(mark.text.lower() + " : " + "Pick Task Complete".lower())
152-
153-
if mark.text.lower() == "Pick Task Complete".lower():
154-
WebDriverWait(self.driver, TIMOUT).until(
155-
EC.element_to_be_clickable(self.elements.NEXTPICKTASK)
156-
).click()
137+
if mark.lower() == "Pick Task Complete".lower():
138+
self.try_click_element(self.elements.NEXTPICKTASK)
157139
else:
158140
break
159141

160142
sleep(self.pick_delay)
161143
station = ""
162144
if "sau" in order.lower():
163-
station = "PackStation03\n"
145+
station = "PackStation03"
164146
else:
165-
station = "PackStation02\n"
147+
station = "PackStation02"
166148

167-
WebDriverWait(self.driver, TIMOUT).until(
168-
EC.element_to_be_clickable(self.elements.STATIONINPUT)
169-
).send_keys(station)
170-
171-
sleep(3)
172-
173-
WebDriverWait(self.driver, TIMOUT).until(
174-
EC.element_to_be_clickable(self.elements.NEXTORDERBUTTON)
175-
).click()
176-
sleep(self.pick_delay)
149+
self.try_send_keys_element(self.elements.STATIONINPUT, station)
150+
self.try_click_element(self.elements.STATIONBUTTON)
151+
self.try_click_element(self.elements.NEXTORDERBUTTON)
177152
except exceptions.NoSuchWindowException:
178153
self.driver_closed()
179154
return
180155

156+
def try_click_element(self, element, T=10):
157+
for i in range(T):
158+
try:
159+
self.driver.find_element(element[0], element[1]).click()
160+
sleep(self.pick_delay)
161+
return
162+
except Exception as e:
163+
sleep(self.pick_delay)
164+
continue
165+
raise exceptions.NoSuchElementException
166+
167+
def try_send_keys_element(self, element, text):
168+
for i in range(10):
169+
try:
170+
self.driver.find_element(element[0], element[1]).send_keys(text)
171+
sleep(self.pick_delay)
172+
return
173+
except Exception as e:
174+
sleep(self.pick_delay)
175+
continue
176+
raise exceptions.NoSuchElementException
177+
178+
def try_return_text_element(self, element):
179+
for i in range(10):
180+
try:
181+
text = self.driver.find_element(element[0], element[1]).text
182+
return text
183+
except Exception as e:
184+
sleep(self.pick_delay)
185+
continue
186+
raise exceptions.NoSuchElementException
187+
181188
def scan(
182189
self,
183190
my_orders: list,
@@ -303,7 +310,6 @@ def scan(
303310
order_callback(order_list=newlist)
304311

305312
status_flag[0] = True
306-
print("Scanning Complete \n Start Again\n")
307313

308314
def refresh(self, force_refresh_flag=None, status_flag=None, login_callback=None):
309315
"""Re-orients the driver to the start of the mobile emulator website
@@ -474,19 +480,9 @@ def login_microsoft(self, login_flag, username, password, login_failed_callback)
474480
try:
475481
# Will check to see if the username field exists
476482
# It will exist if there is no previous data or data has been wiped
477-
try:
478-
sleep(2)
479-
self.driver.find_element(
480-
self.elements.USERNAMEFIELD[0], self.elements.USERNAMEFIELD[1]
481-
).send_keys(username)
482-
WebDriverWait(self.driver, TIMOUT).until(
483-
EC.element_to_be_clickable(self.elements.NEXTBUTTON)
484-
).click()
485-
sleep(1)
486-
except exceptions.NoSuchElementException:
487-
# doesn't exist meaning there is an existing login
488-
existing_login = True
489-
pass
483+
sleep(2)
484+
self.try_send_keys_element(self.elements.USERNAMEFIELD, username)
485+
self.try_click_element(self.elements.NEXTBUTTON)
490486

491487
try:
492488
self.driver.find_element(By.ID, "usernameError")
@@ -505,13 +501,8 @@ def login_microsoft(self, login_flag, username, password, login_failed_callback)
505501
# means that the login passed
506502
pass
507503

508-
WebDriverWait(self.driver, TIMOUT).until(
509-
EC.element_to_be_clickable(self.elements.PASSWORDFIELD)
510-
).send_keys(password)
511-
512-
WebDriverWait(self.driver, TIMOUT).until(
513-
EC.element_to_be_clickable(self.elements.NEXTBUTTON)
514-
).click()
504+
self.try_send_keys_element(self.elements.PASSWORDFIELD, password)
505+
self.try_click_element(self.elements.NEXTBUTTON)
515506

516507
try:
517508
self.driver.find_element(By.ID, "passwordError")
@@ -530,30 +521,10 @@ def login_microsoft(self, login_flag, username, password, login_failed_callback)
530521
# means the password was successfully entered
531522
pass
532523

533-
WebDriverWait(self.driver, TIMOUT).until(
534-
EC.element_to_be_clickable(self.elements.NOBUTTON)
535-
).click()
524+
self.try_click_element(self.elements.NOBUTTON)
536525

537-
count = 0
538-
while count < TIMOUT:
539-
try:
540-
WebDriverWait(self.driver, 1).until(
541-
EC.element_to_be_clickable(self.elements.NETSUITE_ENVIRONMENT)
542-
).click()
543-
break
544-
except:
545-
pass
546-
try:
547-
WebDriverWait(self.driver, 1).until(
548-
EC.element_to_be_clickable(self.elements.NETSUITEHOMEPAGE)
549-
).click()
550-
break
551-
except:
552-
pass
526+
self.try_click_element(self.elements.NETSUITE_ENVIRONMENT)
553527

554-
count += 1
555-
# page doesn't exist and I think is linked to new accounts made with netsuite not having
556-
# the ability to chose the netsuite environment.
557528
sleep(2)
558529

559530
self.get_to_orders(login_flag=login_flag)
@@ -589,36 +560,16 @@ def get_to_orders(self, login_flag, refresh_flag=False):
589560
self.driver.get(MOBILE_EMULATOR)
590561

591562
try:
592-
sleep(1)
593-
self.driver.find_element(
594-
By.XPATH, "/html/body/div/div/div[3]/button"
595-
).click()
563+
self.try_click_element(self.elements.LASTSESSIONBUTTON, 2)
596564
except exceptions.NoSuchElementException:
597565
pass
598-
sleep(1)
599-
WebDriverWait(self.driver, TIMOUT).until(
600-
EC.element_to_be_clickable(self.elements.WMS)
601-
).click()
602-
sleep(1)
603-
WebDriverWait(self.driver, TIMOUT).until(
604-
EC.element_to_be_clickable(self.elements.WAREHOUSE)
605-
).click()
606-
sleep(1)
607-
WebDriverWait(self.driver, TIMOUT).until(
608-
EC.element_to_be_clickable(self.elements.PICKING)
609-
).click()
610-
sleep(1)
611-
WebDriverWait(self.driver, TIMOUT).until(
612-
EC.element_to_be_clickable(self.elements.SINGLEORDER)
613-
).click()
614-
sleep(1)
615-
WebDriverWait(self.driver, TIMOUT).until(
616-
EC.element_to_be_clickable(self.elements.RELEASEDORDER)
617-
).click()
618-
sleep(1)
619-
WebDriverWait(self.driver, TIMOUT).until(
620-
EC.element_to_be_clickable(self.elements.SALESORDER)
621-
).click()
566+
567+
self.try_click_element(self.elements.WMS)
568+
self.try_click_element(self.elements.WAREHOUSE)
569+
self.try_click_element(self.elements.PICKING)
570+
self.try_click_element(self.elements.SINGLEORDER)
571+
self.try_click_element(self.elements.RELEASEDORDER)
572+
self.try_click_element(self.elements.SALESORDER)
622573

623574
self.state.change_state(self.identify_page())
624575
if login_flag is None:

src/elements.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
"NOBUTTON" :["id","idBtn_Back"],
66
"NETSUITEHOMEPAGE" :["id","uif53"],
77
"NETSUITE_ENVIRONMENT" :["xpath","/html/body/div[2]/div[3]/div/table/tbody/tr[2]/td/table/tbody/tr[2]/td[3]/a"],
8+
"LASTSESSIONBUTTON" :["xpath","//html/body/div/div/div[3]/button"],
89
"WMS" :["xpath","/html/body/div/div/div[2]/div[2]/div/div/div[2]/div[2]/img"],
910
"WAREHOUSE" :["xpath","/html/body/div/div/div[2]/div[2]/div/div[1]/div[2]/div[1]/div/div/div[6]/div[1]/table/tbody/tr[2]/td"],
1011
"PICKING" :["xpath","/html/body/div/div/div[2]/div[2]/div/div[1]/div[2]/div[2]"],
@@ -19,8 +20,10 @@
1920
"ITEMNUMBER" :["xpath","/html/body/div/div/div[2]/div[2]/div/div[1]/div[2]/div[2]/div/span"],
2021
"QUANTITYAMOUNT" :["xpath","/html/body/div/div/div[2]/div[2]/div/div[1]/div[2]/div[2]/div/span"],
2122
"QUANTITYINPUT" :["xpath","/html/body/div/div/div[2]/div[2]/div/div[1]/div[2]/div[4]/div/div[2]/div/div/input"],
23+
"QUANTITYBUTTON" :["xpath", "/html/body/div/div/div[2]/div[2]/div/div[2]/div[1]/div/div[7]/button"],
2224
"NEXTPICKTASK" :["xpath","/html/body/div/div/div[2]/div[2]/div/div[2]/div[1]/div/div[3]/button"],
2325
"STATIONINPUT" :["xpath","/html/body/div/div/div[2]/div[2]/div/div[1]/div[2]/div[1]/div[2]/input"],
26+
"STATIONBUTTON" :["xpath","/html/body/div/div/div[2]/div[2]/div/div[2]/div[1]/div/div[2]/button"],
2427
"NEXTORDERBUTTON" :["xpath","/html/body/div/div/div[2]/div[2]/div/div[2]/div[1]/div/div[2]/button"],
2528
"SALESORDERREFRESH" :["xpath","/html/body/div/div/div[2]/div[2]/div/div[1]/div[2]/div[1]"],
2629
"BACKBUTTONREFRESH" :["xpath","/html/body/div/div/div[2]/div[2]/div/div[2]/div[1]/div[1]/button"]

src/versions.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
{
22
"Chrome_Driver_Version": "",
3-
"App_Version": "1.4.4"
3+
"App_Version": "1.4.5"
44
}

0 commit comments

Comments
 (0)