-
Notifications
You must be signed in to change notification settings - Fork 0
/
messagesUI.py
189 lines (141 loc) · 8.55 KB
/
messagesUI.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
import time
import random
import globalConstants
from selenium.webdriver.common.keys import Keys
from seleniumTools import *
from generalTools import *
from spyReport import SpyReport
class MessagesUI:
def __init__(self, driver):
#inicializamos el driver
self.driver = driver
#cargamos configuraciones necesarias
self.numeroDeSodasPorEspionaje = int(globalConstants.config.getAttribute("sondasPorEspiojane"))
#inicializamos las listas de mensajes
self.spyReports = []
#Navegamos a galaxia. Para seguir utilizando el objeto no deberemos navegar fuera de esta pantalla hasta que hallamos acabado o se producira un error no controlado
self.goToMessages()
print "Se inicializa el sistema de gestion de mensajes"
def goToMessages(self):
#vamos a la pantalla de mensajes
getElementByXPath(self.driver, 10, ".//*[@id='message-wrapper']/a[contains(@class, 'messages')]").click()
#devuelve True si los mensajes todavia se estan cargando
def areMessagesLoading(self):
galaxyLoadingElement = getElementByXPath(self.driver, 10, ".//img[contains(@class,'ajax_load_img')]")
return galaxyLoadingElement.is_displayed()
def waitToLoad(self, tabName):
#Esperamos hasta que se carguen los mensajes o hayan pasado 10 segundos
segundosEsperando = 0
while self.areMessagesLoading():
segundosEsperando += 1
time.sleep(1)
if (segundosEsperando>=10):
break
if segundosEsperando >= 10:
#El cliente nos ha desconectado. Debemos volver a conectar e ir a la pantalla de mensajes que queriamos ir
#pulsamos el boton salir
getElementByXPath(self.driver, 10, ".//*[@id='bar']//a[contains(text(),'Salir')]").click()
#relogeamos
reLogin(self.driver)
#vamos a la pantalla de mensajes que queriramos ir
self.goToMessages()
self.goToTab(tabName)
def goToTab(self, tabName):
getElementByXPath(self.driver, 10, ".//div[@class='tab_ctn']//a[contains(text(), '"+tabName+"')]").click()
self.waitToLoad(tabName)
#parsea un report de espionaje y devuelve el objeto con la informacion que contiene
def parseSpyReport(self, mensaje):
msgID = int(mensaje.get_attribute("data-msg-id"))
nombre = getElementByXPath(mensaje, 10 , ".//a[contains(@href,'ogame.gameforge.com/game/index.php?page=galaxy&galaxy=')]").text;
textoFlotas = getElementByXPath(mensaje, 10, ".//span[contains(text(),'Flotas')]").text.replace(".","")
flotas = int (textoFlotas[textoFlotas.find(":")+1:len(textoFlotas)])
textoDefensas = getElementByXPath(mensaje, 10, ".//span[contains(text(),'Defensa')]").text.replace(".","")
defensas = int (textoDefensas[textoDefensas.find(":")+1:len(textoDefensas)])
textoRecursos = getElementByXPath(mensaje, 10, ".//span[contains(text(),'Recursos')]").text.replace(".","")
recursos = int (textoRecursos[textoRecursos.find(":")+1:len(textoRecursos)])
textoBotin = getElementByXPath(mensaje, 10, ".//span[contains(text(),'Bot')]").text.replace(".","")
botin = int (textoBotin[textoBotin.find(":")+1:len(textoBotin)-1])
textoPlaneta = getElementByXPath(mensaje, 10, ".//a[@class='txt_link']").text
textoPlaneta = textoPlaneta[textoPlaneta.find("[")+1:len(textoPlaneta)-1]
galaxia = textoPlaneta[0:textoPlaneta.find(":")]
textoPlaneta = textoPlaneta[textoPlaneta.find(":")+1:len(textoPlaneta)]
sistema = textoPlaneta[0:textoPlaneta.find(":")]
posicionPlaneta = textoPlaneta[textoPlaneta.find(":")+1:len(textoPlaneta)]
return SpyReport(msgID, nombre, flotas, defensas, recursos, botin, galaxia, sistema, posicionPlaneta)
def refreshSpyReport(self, idReport):
reportRefrescado = False
logPrinted = False
while not reportRefrescado:
#primero debemos saber si tenemos sondas suficientes disponibles y espacio de flotas para poder lanzarlas
if globalConstants.fleetControl.espacioFlotaDisponible() and globalConstants.fleetControl.probeAvailable(self.numeroDeSodasPorEspionaje):
#podemos lanzar la flota de sondas
globalConstants.fleetControl.sendFleet(0,0,self.numeroDeSodasPorEspionaje)
#solo falta clickar el boton de espiar del planeta para enviar las sondas
getElementByXPath(self.driver, 10, ".//a[contains(text(),'"+idReport+"')]/../../..//a[contains(@onclick, 'sendShipsWithPopup')]").click()
#despues de espiar un planeta esperamos entre 1 y 2 segundos para dejar tiempo al cliente (popups, etc)
time.sleep(1)
#Ahora borramos el repor antiguo
getElementByXPath(self.driver, 10, ".//a[contains(text(),'"+idReport+"')]/../../..//a[@class = 'fright']").click()
#esperamos 1 segundo
time.sleep(1)
reportRefrescado = True
print "[ESPIONAJE] Se han lanzado sondas para refrescar el report y se ha borrado el report antiguo con id "+str(idReport)
else:
#esperamos 1 segundo a que las sondas vuelvan y a tener espacio de flota para poder enviarlas
if logPrinted == False:
print "No hay sondas o espacio de flota suficiente para realizar el espionaje. Esperando que las sondas vuelvan a la base."
logPrinted = True
time.sleep(1)
def refreshSpyReports(self):
print "Se procede a lanzar nuevos espionajes contra todos los planetas espiados anteriormente"
self.goToTab("Espionaje")
for report in self.spyReports:
reintentos = 0
while reintentos < 3:
try:
self.refreshSpyReport(report.nombre)
break
except Exception as error:
#Aveces queda demasiado abajo el icono y no se puede clickar, nos movemos hacia abajo y reintentamos
reintentos+=1
self.driver.switch_to.active_element.send_keys(Keys.PAGE_DOWN)
#esperamos que vuelvan todas las sondas que todavia esten volando
print "Esperando que vuelvan las sondas para analizar los nuevos reports (90 secs aprox)..."
globalConstants.fleetControl.waitForSpyProbes()
#recargamos la pantalla para que aparezcan los nuevos reports
self.goToMessages()
self.goToTab("Espionaje")
#recargamos la lista de reports con los nuevos reports
self.populateSpyReports()
#elimina todos los reports que no son utiles de la lista de msgs
def deleteNonUsefulMsgs(self):
#Eliminamos los reports de espionajes que nos han hecho a nosotros. Solo nos interesan los que nosotros hemos enviado
print "Se eliminan los mensajes que no son reports de espionaje o de planetas destruidos"
mensajes = self.driver.find_elements_by_xpath(".//span[contains(text(),'Acci')]//..//a[@class='fright']")
mensajes.extend(self.driver.find_elements_by_xpath(".//span[contains(text(),'destruido')]//..//a[@class='fright']"))
for mensaje in mensajes:
if mensaje.is_displayed():
reintentos = 0
while reintentos < 3:
try:
mensaje.click()
time.sleep(1)
break
except Exception as error:
#Aveces queda demasiado abajo el icono y no se puede clickar, nos movemos hacia abajo y reintentamos
reintentos+=1
self.driver.switch_to.active_element.send_keys(Keys.PAGE_DOWN)
def populateSpyReports(self):
print "Se procede a parsear la lista de reports de espionaje"
self.goToTab("Espionaje")
self.spyReports = []
#Antes de empezar a parsear los mensajes de espionaje, eliminamos los posibles espionajes que nos hayan hecho a nosotors
self.deleteNonUsefulMsgs()
mensajes = self.driver.find_elements_by_xpath(".//li[not(contains(@class,'no_msg'))][contains(@class,'msg')]")
for mensaje in mensajes:
if mensaje.is_displayed():
spyReport = self.parseSpyReport(mensaje)
self.spyReports.append(spyReport)
#ordenamos la lista de reports segun el botin disponible en cada planeta
self.spyReports.sort(key=lambda x: x.botinPosible, reverse=True)
print "Todos los reports de espionaje han sido parseados correctamente"