2015-02-27 9 views
6

Sono nuovo a PhantomJS e sto provando a eseguire i miei test di selenio (python) utilizzando il driver phantomjs ma non gli elementi web.Il driver Phantom JS non è in grado di individuare gli elementi a volte

tronchi Ghostdriver:

[INFO - 2015-02-27T15:24:40.236Z] GhostDriver - Main - running on port 52653 
[INFO - 2015-02-27T15:24:41.075Z] Session [bfd397f0-be94-11e4-ad03-b711254501c8] - page.settings - {"XSSAuditingEnabled":false,"javascriptCanCloseWindows":true,"javascriptCanOpenWindows":true,"javascriptEnabled":true,"loadImages":true,"localToRemoteUrlAccessEnabled":false,"userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.0.0 Safari/538.1","webSecurityEnabled":true} 
[INFO - 2015-02-27T15:24:41.075Z] Session [bfd397f0-be94-11e4-ad03-b711254501c8] - page.customHeaders: - {} 
[INFO - 2015-02-27T15:24:41.075Z] Session [bfd397f0-be94-11e4-ad03-b711254501c8] - Session.negotiatedCapabilities - {"browserName":"phantomjs","version":"2.0.0","driverName":"ghostdriver","driverVersion":"1.2.0","platform":"mac-10.9 (Mavericks)-64bit","javascriptEnabled":true,"takesScreenshot":true,"handlesAlerts":false,"databaseEnabled":false,"locationContextEnabled":false,"applicationCacheEnabled":false,"browserConnectionEnabled":false,"cssSelectorsEnabled":true,"webStorageEnabled":false,"rotatable":false,"acceptSslCerts":false,"nativeEvents":true,"proxy":{"proxyType":"direct"}} 
[INFO - 2015-02-27T15:24:41.075Z] SessionManagerReqHand - _postNewSessionCommand - New Session Created: bfd397f0-be94-11e4-ad03-b711254501c8 
[ERROR - 2015-02-27T15:24:47.242Z] WebElementLocator - _handleLocateCommand - Element(s) NOT Found: GAVE UP. Search Stop Time: 1425050687190 

    :262 in error 

La parte interessante è che, dopo aver installato con successo phantomjs, ho corso la mia prova di accesso ed è passato senza alcun problema. Poi ho eseguito un altro test che è fallito per lo stesso motivo sopra menzionato. Ho provato a eseguire nuovamente il test di accesso che è passato, ma il driver di phantomjs non ha più trovato gli elementi.

Qualche idea di cosa sta causando questo?

proposito, questi test eseguire bene con cromo e FF

+0

try 'time.sleep (5)' invece di 'WebDriverWait' – Olexandr

risposta

0

ho notato tali elementi non sono stati situati in casi di test utilizzando metodi di find_element conducente phantomJS, che può essere letta da JavaScript utilizzando JavascriptExecutor. Usa lo script java per accedere all'elemento e per l'azione su un elemento. Spero che questo risolva il tuo problema.

+0

Grazie per la risposta. Ma questa soluzione non funzionerà per me. Dovrò apportare molte modifiche per farlo funzionare :( – rootimbo

0

È possibile che il test del selenio provi a trovare l'elemento prima che venga caricato. Dopo il primo tentativo fallito, dovresti provare ancora e ancora e continuare finché non trovi l'elemento o il timeout superato.

Guarda scheggia https://splinter.readthedocs.org/en/latest/index.html Funziona con il selenio e implementa la logica dell'attesa di elementi.

+0

Sto aspettando 10 secondi per individuare l'elemento, dopo di che viene generata un'eccezione di timeout. File "/Library/Python/2.7/site-packages/selenium/ webdriver/support/wait.py ", riga 71, fino a aumento TimeoutException (messaggio) TimeoutException: Messaggio: – rootimbo

3

Quindi ... sembra che qualsiasi elemento che utilizza Selenium WebDriver Wait stia effettivamente utilizzando uno schema di polling. Ricordare che un'attesa esplicita di selenio è un codice che si definisce in attesa di una determinata condizione prima di procedere ulteriormente nel codice. WebDriverWait di default chiama la ExpectedCondition ogni 500 millisecondi finché non ritorna correttamente. (reference.) Ciò significa che ogni 500 mSecs, Selenium verifica la condizione di attesa. Se è vero, procedere. Se non è ancora vero, attendere un altro ciclo di frequenza di polling, quindi riprovare.

E dal mio test, la mia convinzione è che un test sondaggio e non-pronto eppure così chiamano un fail sicuramente genera un errore nel mio ghostdriver.log

[ERROR - 2016-08-14T08:50:12.896Z] WebElementLocator - _handleLocateCommand - Element(s) NOT Found: GAVE UP. Search Stop Time: 1471164612878 

Sto lavorando su un progetto che raschia un sito AJAX a pagina singola complesso. Poiché il sito ri-utilizza gli elementi div comuni, devo fare un sacco di chiamate (cancellare, incollare il valore, fare clic, attendere, andare su una tabella diversa sulla pagina, copiare i dati di interesse, ripetere ...) per ottenere il dati di cui ho bisogno E perché il sito è una sorta di lento, applico elementi di attesa tramite:

driver.wait.until(EC.presence_of_element_located((By.XPATH, "//*[@id='special_content_id']//td[contains(.,'" + info.unitId + "')]"))) 

Si scopre che la frequenza di polling è impostato nella classe selenium.webdriver.support.wait.WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)

Reference here.

ero curioso di sapere il comportamento. Quando la mia poll_frequency è stata impostata su 0,5 secondi, ho ricevuto 98 errori WebElementLocator. Quando l'ho passato a 7,5 secondi, driver.wait = WebDriverWait(driver, 60, 7.5), ho ricevuto solo 36 errori. I tempi di sondaggio più piccoli generano più errori.

Quello che trovo davvero strano è che non mi aspetto un normale comportamento di polling (selenio) per impostare un errore di registro ovunque (PhantomJS). Vorrei che ci fosse una voce di registro diversa per un sondaggio, elemento non ancora pronto ...