Skip to content

Commit 9ae8b17

Browse files
author
Leith Merrifield
committed
Elements are now read from a json file so that it
doesn't need to be rebuilt for every ui change.
1 parent 4742025 commit 9ae8b17

File tree

5 files changed

+167
-88
lines changed

5 files changed

+167
-88
lines changed

src/Elements.py

Lines changed: 87 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,69 +1,98 @@
11
from selenium.webdriver.common.by import By
2+
import json
23

3-
USERNAMEFIELD = (By.ID, "i0116")
4-
PASSWORDFIELD = (By.ID, "i0118")
5-
NEXTBUTTON = (By.ID, "idSIButton9")
6-
NOBUTTON = (By.ID, "idBtn_Back")
74

5+
class ElementClass:
6+
def __init__(self) -> None:
7+
self.element_error_flag = False
8+
self.elements = self.read_elements_from_json()
89

9-
NETSUITEHOMEPAGE = (By.ID, "uif53") # netsuite homepage identifier?
10+
if self.element_error_flag:
11+
return
1012

11-
NETSUITE_ENVIRONMENT = (
12-
By.XPATH,
13-
"/html/body/div[2]/div[3]/div/table/tbody/tr[2]/td/table/tbody/tr[2]/td[3]/a",
14-
)
15-
WMS = (By.XPATH, "/html/body/div/div/div[2]/div[2]/div/div/div[2]/div[2]/img")
16-
WAREHOUSE = (
17-
By.XPATH,
18-
"/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",
19-
)
20-
PICKING = (By.XPATH, "/html/body/div/div/div[2]/div[2]/div/div[1]/div[2]/div[2]")
21-
SINGLEORDER = (By.XPATH, "/html/body/div/div/div[2]/div[2]/div/div[1]/div[2]/div[1]")
22-
RELEASEDORDER = (By.XPATH, "/html/body/div/div/div[2]/div[2]/div/div[1]/div[2]/div[2]")
23-
SALESORDER = (By.XPATH, "/html/body/div/div/div[2]/div[2]/div/div[1]/div[2]/div[1]")
13+
self.assign_ui_elements(self.elements)
2414

25-
ORDERINPUT = (
26-
By.XPATH,
27-
"/html/body/div/div/div[2]/div[2]/div/div[1]/div[2]/div[1]/div[2]/input",
28-
)
29-
ORDERINPUTWITHERROR = (
30-
By.XPATH,
31-
"/html/body/div/div/div[2]/div[2]/div/div[1]/div[3]/div[1]/div[2]/input",
32-
)
33-
ENTERORDER = (
34-
By.XPATH,
35-
"/html/body/div/div/div[2]/div[2]/div/div[2]/div[1]/div/div[3]/button",
36-
)
15+
def read_elements_from_json(self):
16+
try:
17+
with open(r".\src\elements.json", "r", encoding="utf-8") as openfile:
18+
return json.load(openfile)
19+
except FileNotFoundError:
20+
self.element_error_flag = True
3721

38-
FIRSTENTRY = (
39-
By.XPATH,
40-
"/html/body/div/div/div[2]/div[2]/div/div[1]/div[2]/div[2]/div/div/div[6]/div[1]/table/tbody/tr[1]",
41-
)
42-
BINNUMBER = (By.XPATH, "/html/body/div/div/div[2]/div[2]/div/div[1]/div[2]/div[2]/div/span")
43-
ITEMNUMBER = (
44-
By.XPATH,
45-
"/html/body/div/div/div[2]/div[2]/div/div[1]/div[2]/div[2]/div/span",
46-
)
47-
QUANTITYAMOUNT = (By.XPATH,"/html/body/div/div/div[2]/div[2]/div/div[1]/div[2]/div[2]/div/span",)
48-
QUANTITYINPUT = (
49-
By.XPATH,
50-
"/html/body/div/div/div[2]/div[2]/div/div[1]/div[2]/div[4]/div/div[2]/div/div/input",
51-
)
52-
NEXTPICKTASK = (
53-
By.XPATH,
54-
"/html/body/div/div/div[2]/div[2]/div/div[2]/div[1]/div/div[3]/button",
55-
)
56-
STATIONINPUT = (
57-
By.XPATH,
58-
"/html/body/div/div/div[2]/div[2]/div/div[1]/div[2]/div[1]/div[2]/input",
59-
)
60-
NEXTORDERBUTTON = (
61-
By.XPATH,
62-
"/html/body/div/div/div[2]/div[2]/div/div[2]/div[1]/div/div[2]/button",
63-
)
22+
def assign_ui_elements(self, dict):
23+
self.USERNAMEFIELD = self.elements["USERNAMEFIELD"]
24+
self.PASSWORDFIELD = self.elements["PASSWORDFIELD"]
25+
self.NEXTBUTTON = self.elements["NEXTBUTTON"]
26+
self.NOBUTTON = self.elements["NOBUTTON"]
27+
self.NETSUITEHOMEPAGE = self.elements[
28+
"NETSUITEHOMEPAGE"
29+
] # netsuite homepage identifier?
30+
self.NETSUITE_ENVIRONMENT = (
31+
self.elements["NETSUITE_ENVIRONMENT"][0],
32+
self.elements["NETSUITE_ENVIRONMENT"][1],
33+
)
34+
self.WMS = (self.elements["WMS"][0], self.elements["WMS"][1])
35+
self.WAREHOUSE = (self.elements["WAREHOUSE"][0], self.elements["WAREHOUSE"][1])
36+
self.PICKING = (self.elements["PICKING"][0], self.elements["PICKING"][1])
37+
self.SINGLEORDER = (
38+
self.elements["SINGLEORDER"][0],
39+
self.elements["SINGLEORDER"][1],
40+
)
41+
self.RELEASEDORDER = (
42+
self.elements["RELEASEDORDER"][0],
43+
self.elements["RELEASEDORDER"][1],
44+
)
45+
self.SALESORDER = (
46+
self.elements["SALESORDER"][0],
47+
self.elements["SALESORDER"][1],
48+
)
49+
self.ORDERINPUT = (
50+
self.elements["ORDERINPUT"][0],
51+
self.elements["ORDERINPUT"][1],
52+
)
53+
self.ORDERINPUTWITHERROR = (
54+
self.elements["ORDERINPUTWITHERROR"][0],
55+
self.elements["ORDERINPUTWITHERROR"][1],
56+
)
57+
self.ENTERORDER = (
58+
self.elements["ENTERORDER"][0],
59+
self.elements["ENTERORDER"][1],
60+
)
61+
self.FIRSTENTRY = (
62+
self.elements["FIRSTENTRY"][0],
63+
self.elements["FIRSTENTRY"][1],
64+
)
65+
self.BINNUMBER = (self.elements["BINNUMBER"][0], self.elements["BINNUMBER"][1])
66+
self.ITEMNUMBER = (
67+
self.elements["ITEMNUMBER"][0],
68+
self.elements["ITEMNUMBER"][1],
69+
)
70+
self.QUANTITYAMOUNT = (
71+
self.elements["QUANTITYAMOUNT"][0],
72+
self.elements["QUANTITYAMOUNT"][1],
73+
)
74+
self.QUANTITYINPUT = (
75+
self.elements["QUANTITYINPUT"][0],
76+
self.elements["QUANTITYINPUT"][1],
77+
)
78+
self.NEXTPICKTASK = (
79+
self.elements["NEXTPICKTASK"][0],
80+
self.elements["NEXTPICKTASK"][1],
81+
)
82+
self.STATIONINPUT = (
83+
self.elements["STATIONINPUT"][0],
84+
self.elements["STATIONINPUT"][1],
85+
)
86+
self.NEXTORDERBUTTON = (
87+
self.elements["NEXTORDERBUTTON"][0],
88+
self.elements["NEXTORDERBUTTON"][1],
89+
)
90+
91+
SALESORDERREFRESH = "/html/body/div/div/div[2]/div[2]/div/div[1]/div[2]/div[1]"
92+
BACKBUTTONREFRESH = (
93+
"/html/body/div/div/div[2]/div[2]/div/div[2]/div[1]/div[1]/button"
94+
)
6495

65-
SALESORDERREFRESH = "/html/body/div/div/div[2]/div[2]/div/div[1]/div[2]/div[1]"
66-
BACKBUTTONREFRESH = "/html/body/div/div/div[2]/div[2]/div/div[2]/div[1]/div[1]/button"
6796

6897
STAGE = [
6998
"Select Application",

src/LoginScreen.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,9 @@ def do_login(self):
9696
# if "@bollebrands.com" not in username.lower() or password == "":
9797
# return
9898

99+
if not self.driver.continue_program:
100+
return
101+
99102
if self.ids.login_checkbox.active:
100103
self.store_login(username, password)
101104

src/MainWebDriver.py

Lines changed: 49 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from selenium.common import exceptions
77
from selenium.webdriver.common.alert import Alert
88
from selenium.webdriver.chrome.options import Options
9-
from src import Elements
9+
from src.Elements import ElementClass
1010
from src.state import State
1111
from src.CheckDriver import compare_and_download as update_driver
1212
from selenium.webdriver.chrome.service import (
@@ -57,7 +57,10 @@ def __init__(self) -> None:
5757
self.order_list = []
5858
self.state = State()
5959
self.driver = None
60+
self.continue_program = True
6061
self.pick_delay = 1.5
62+
self.elements = ElementClass()
63+
self.check_if_elements_exist()
6164

6265
def read_links(self):
6366
"""Reads settings json file and returns json object
@@ -92,6 +95,18 @@ def run_driver(self, chrome_service, chrome_options, manual_flag) -> None:
9295
service=chrome_service, chrome_options=chrome_options
9396
)
9497

98+
def check_if_elements_exist(self):
99+
if self.elements.element_error_flag:
100+
Clock.schedule_once(
101+
partial(
102+
self.test_popup,
103+
"elements.json doesn't exist",
104+
"reinstall autoscanner",
105+
),
106+
1,
107+
)
108+
self.continue_program = False
109+
95110
def pick(self, order):
96111
"""
97112
Continually Crawls through individual picking of each item untill it detects
@@ -106,26 +121,27 @@ def pick(self, order):
106121
while True:
107122
sleep(self.pick_delay)
108123
WebDriverWait(self.driver, TIMOUT).until(
109-
EC.element_to_be_clickable(Elements.FIRSTENTRY)
124+
EC.element_to_be_clickable(self.elements.FIRSTENTRY)
110125
).click()
111126
sleep(self.pick_delay)
112127
WebDriverWait(self.driver, TIMOUT).until(
113-
EC.element_to_be_clickable(Elements.BINNUMBER)
128+
EC.element_to_be_clickable(self.elements.BINNUMBER)
114129
).click()
115130
sleep(self.pick_delay)
116131
WebDriverWait(self.driver, TIMOUT).until(
117-
EC.element_to_be_clickable(Elements.ITEMNUMBER)
132+
EC.element_to_be_clickable(self.elements.ITEMNUMBER)
118133
).click()
119134
sleep(self.pick_delay)
120135

121-
122-
amount = self.driver.find_element(Elements.QUANTITYAMOUNT[0],Elements.QUANTITYAMOUNT[1]).text.split(" ")[0]
136+
amount = self.driver.find_element(
137+
self.elements.QUANTITYAMOUNT[0], self.elements.QUANTITYAMOUNT[1]
138+
).text.split(" ")[0]
123139
amount += "\n"
124140
sleep(1)
125141
WebDriverWait(self.driver, TIMOUT).until(
126-
EC.element_to_be_clickable(Elements.QUANTITYINPUT)
142+
EC.element_to_be_clickable(self.elements.QUANTITYINPUT)
127143
).send_keys(amount)
128-
144+
129145
sleep(self.pick_delay)
130146

131147
mark = self.driver.find_element(
@@ -136,7 +152,7 @@ def pick(self, order):
136152

137153
if mark.text.lower() == "Pick Task Complete".lower():
138154
WebDriverWait(self.driver, TIMOUT).until(
139-
EC.element_to_be_clickable(Elements.NEXTPICKTASK)
155+
EC.element_to_be_clickable(self.elements.NEXTPICKTASK)
140156
).click()
141157
else:
142158
break
@@ -149,13 +165,13 @@ def pick(self, order):
149165
station = "PackStation02\n"
150166

151167
WebDriverWait(self.driver, TIMOUT).until(
152-
EC.element_to_be_clickable(Elements.STATIONINPUT)
168+
EC.element_to_be_clickable(self.elements.STATIONINPUT)
153169
).send_keys(station)
154170

155171
sleep(3)
156172

157173
WebDriverWait(self.driver, TIMOUT).until(
158-
EC.element_to_be_clickable(Elements.NEXTORDERBUTTON)
174+
EC.element_to_be_clickable(self.elements.NEXTORDERBUTTON)
159175
).click()
160176
sleep(self.pick_delay)
161177
except exceptions.NoSuchWindowException:
@@ -203,19 +219,23 @@ def scan(
203219
# but I may aswell do it this way
204220
try:
205221
WebDriverWait(self.driver, 2).until(
206-
EC.element_to_be_clickable(Elements.ORDERINPUT)
222+
EC.element_to_be_clickable(self.elements.ORDERINPUT)
207223
).clear()
208224
WebDriverWait(self.driver, 2).until(
209-
EC.element_to_be_clickable(Elements.ORDERINPUT)
225+
EC.element_to_be_clickable(self.elements.ORDERINPUT)
210226
).send_keys(order)
211227
except exceptions.TimeoutException:
212228
# Timeout in finding the normal textbox to enter the order into
213229
try:
214230
WebDriverWait(self.driver, 2).until(
215-
EC.element_to_be_clickable(Elements.ORDERINPUTWITHERROR)
231+
EC.element_to_be_clickable(
232+
self.elements.ORDERINPUTWITHERROR
233+
)
216234
).clear()
217235
WebDriverWait(self.driver, 2).until(
218-
EC.element_to_be_clickable(Elements.ORDERINPUTWITHERROR)
236+
EC.element_to_be_clickable(
237+
self.elements.ORDERINPUTWITHERROR
238+
)
219239
).send_keys(order)
220240
except exceptions.TimeoutException as e:
221241
# At this point there is no text box to enter into at all
@@ -232,7 +252,7 @@ def scan(
232252
continue
233253

234254
WebDriverWait(self.driver, 2).until(
235-
EC.element_to_be_clickable(Elements.ENTERORDER)
255+
EC.element_to_be_clickable(self.elements.ENTERORDER)
236256
).click()
237257

238258
try:
@@ -457,10 +477,10 @@ def login_microsoft(self, login_flag, username, password, login_failed_callback)
457477
try:
458478
sleep(2)
459479
self.driver.find_element(
460-
Elements.USERNAMEFIELD[0], Elements.USERNAMEFIELD[1]
480+
self.elements.USERNAMEFIELD[0], self.elements.USERNAMEFIELD[1]
461481
).send_keys(username)
462482
WebDriverWait(self.driver, TIMOUT).until(
463-
EC.element_to_be_clickable(Elements.NEXTBUTTON)
483+
EC.element_to_be_clickable(self.elements.NEXTBUTTON)
464484
).click()
465485
sleep(1)
466486
except exceptions.NoSuchElementException:
@@ -486,11 +506,11 @@ def login_microsoft(self, login_flag, username, password, login_failed_callback)
486506
pass
487507

488508
WebDriverWait(self.driver, TIMOUT).until(
489-
EC.element_to_be_clickable(Elements.PASSWORDFIELD)
509+
EC.element_to_be_clickable(self.elements.PASSWORDFIELD)
490510
).send_keys(password)
491511

492512
WebDriverWait(self.driver, TIMOUT).until(
493-
EC.element_to_be_clickable(Elements.NEXTBUTTON)
513+
EC.element_to_be_clickable(self.elements.NEXTBUTTON)
494514
).click()
495515

496516
try:
@@ -511,21 +531,21 @@ def login_microsoft(self, login_flag, username, password, login_failed_callback)
511531
pass
512532

513533
WebDriverWait(self.driver, TIMOUT).until(
514-
EC.element_to_be_clickable(Elements.NOBUTTON)
534+
EC.element_to_be_clickable(self.elements.NOBUTTON)
515535
).click()
516536

517537
count = 0
518538
while count < TIMOUT:
519539
try:
520540
WebDriverWait(self.driver, 1).until(
521-
EC.element_to_be_clickable(Elements.NETSUITE_ENVIRONMENT)
541+
EC.element_to_be_clickable(self.elements.NETSUITE_ENVIRONMENT)
522542
).click()
523543
break
524544
except:
525545
pass
526546
try:
527547
WebDriverWait(self.driver, 1).until(
528-
EC.element_to_be_clickable(Elements.NETSUITEHOMEPAGE)
548+
EC.element_to_be_clickable(self.elements.NETSUITEHOMEPAGE)
529549
).click()
530550
break
531551
except:
@@ -577,27 +597,27 @@ def get_to_orders(self, login_flag, refresh_flag=False):
577597
pass
578598
sleep(1)
579599
WebDriverWait(self.driver, TIMOUT).until(
580-
EC.element_to_be_clickable(Elements.WMS)
600+
EC.element_to_be_clickable(self.elements.WMS)
581601
).click()
582602
sleep(1)
583603
WebDriverWait(self.driver, TIMOUT).until(
584-
EC.element_to_be_clickable(Elements.WAREHOUSE)
604+
EC.element_to_be_clickable(self.elements.WAREHOUSE)
585605
).click()
586606
sleep(1)
587607
WebDriverWait(self.driver, TIMOUT).until(
588-
EC.element_to_be_clickable(Elements.PICKING)
608+
EC.element_to_be_clickable(self.elements.PICKING)
589609
).click()
590610
sleep(1)
591611
WebDriverWait(self.driver, TIMOUT).until(
592-
EC.element_to_be_clickable(Elements.SINGLEORDER)
612+
EC.element_to_be_clickable(self.elements.SINGLEORDER)
593613
).click()
594614
sleep(1)
595615
WebDriverWait(self.driver, TIMOUT).until(
596-
EC.element_to_be_clickable(Elements.RELEASEDORDER)
616+
EC.element_to_be_clickable(self.elements.RELEASEDORDER)
597617
).click()
598618
sleep(1)
599619
WebDriverWait(self.driver, TIMOUT).until(
600-
EC.element_to_be_clickable(Elements.SALESORDER)
620+
EC.element_to_be_clickable(self.elements.SALESORDER)
601621
).click()
602622

603623
self.state.change_state(self.identify_page())

0 commit comments

Comments
 (0)