Sto provando a scrivere la mia condizione prevista. Quello di cui ho bisogno ... Ho un iframe. e ho anche un'immagine in esso. Voglio continuare l'elaborazione quando cambiò l'immagine. Quello che ho fatto:Python Selenium WebDriver. Sto scrivendo la mia condizione prevista
class url_changed_condition(object):
'''
Checks whether url in iframe has changed or not
'''
def __init__(self, urls):
self._current_url, self._new_url = urls
def __call__(self, ignored):
return self._current_url != self._new_url
e successivamente nel codice che ho:
def process_image(self, locator, current_url):
try:
WebDriverWait(self.driver, 10).until(ec.presence_of_element_located((By.TAG_NAME, u"iframe")))
iframe = self.driver.find_element(*locator)
if iframe:
print "Iframe found!"
self.driver.switch_to_frame(iframe)
WebDriverWait(self.driver, 10).until(ec.presence_of_element_located((By.XPATH, u"//div")))
# WebDriverWait(self.driver, 10).until(
# url_changed_condition(
# (current_url, self.driver.find_element(By.XPATH, u"//a/img").get_attribute(u"src"))))
img_url = self.driver.find_element(By.XPATH, u"//a/img").get_attribute(u"src")
print img_url
self.search_dict[self._search_item].append(img_url)
self.driver.switch_to_default_content()
except NoSuchElementException as NSE:
print "iframe not found! {0}".format(NSE.msg)
except:
print "something went wrong"
import traceback
import sys
type_, value_, trace_ = sys.exc_info()
print type_, value_
print traceback.format_tb(trace_)
finally:
return current_url
questo codice funziona, ma restituisce lo stesso URL più volte. Il problema è quando ho decomposto url_changed_condition
cade con TimeoutException
in
(current_url, self.driver.find_element(By.XPATH, u"//a/img").get_attribute(u"src"))
La riga sotto funziona bene ... Non capisco.
mi stai dicendo esattamente quello che ho conosciuto. La tua risposta è esattamente ciò che ho codificato qui. Ho bisogno di 'self.driver.find_element (By.XPATH, u" // a/img "). Get_attribute (u" src ")' per essere chiamato ogni 500 millisecondi per confrontare il suo valore di ritorno con quello che ho già ricevuto. E quando non sono uguali il mio '__call __()' restituirà 'True'. –
Stavo solo spiegando perché hai ottenuto il 'TimeoutException', dato che nella tua domanda non sembravi capire perché. Come ho detto, il tuo problema è che stai controllando l'elemento sbagliato (dal momento che l'URL apparentemente non cambia mai), o il periodo di timeout è troppo basso. Prova ad aumentarlo per più di 10 secondi. Un'altra opzione sarebbe quella di verificare un altro caso nell'iframe. Non ho familiarità con il sito che stai testando, quindi non posso aiutarti ulteriormente. – imiric
Sono arrivato qui perché "Un risultato positivo è per il tipo ExpectedCondition è Boolean restituisce il valore restituito vero o non nullo per tutti gli altri tipi di ExpectedCondition" È scritto in modo orribile e non ha assolutamente senso .... – FoxMulder900