2017-07-05 1 views
1

Je courais le code ci-dessous que sa prise de la capture d'écran comme prévuWebDriver attend pas travailler avec PhantomJS tout en travaillant correctement avec chromedriver

from selenium import webdriver 
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.webdriver.common.by import By 

driver=webdriver.Chrome() 
driver.get("https://app.wisemapping.com/c/maps/579829/public") 
WebDriverWait(driver,10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "#workspaceContainer > svg > [preserveAspectRatio]"))) 
] 
driver.save_screenshot('screen.png') 
driver.quit() 

mais quand je me sers PhantomJS son échec

dcap = dict(DesiredCapabilities.PHANTOMJS) 

dcap["phantomjs.page.settings.userAgent"] = ('Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.22564.0 Safari/537.36') 

driver = webdriver.PhantomJS(desired_capabilities=dcap,service_args=['--ignore-ssl-errors=true', '--ssl-protocol=any','--web-security=false']) 

driver.get("https://app.wisemapping.com/c/maps/579829/public") 
     WebDriverWait(driver,10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "#workspaceContainer > svg > [preserveAspectRatio]"))) 
     ] 
driver.save_screenshot('screen.png') 
driver.quit() 

l'erreur est son don

Traceback (most recent call last): 
    File "C:/Users/HelloWorld.py", line 24, in <module> 
    WebDriverWait(driver,10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "#workspaceContainer > svg > [preserveAspectRatio]"))) 
    File "C:\Python27\lib\site-packages\selenium\webdriver\support\wait.py", line 80, in until 
    raise TimeoutException(message, screen, stacktrace) 
selenium.common.exceptions.TimeoutException: Message: 
Screenshot: available via screen 

Si je prends attendre & capture d'écran i n essayez sauf bloc que sa prise d'écran de la page mais l'élément qui est en attente ne vient pas. Même si j'augmente délai d'attente de 30 secondes sa ne fonctionne pas

J'utilise Sélénium 3.4 et python 2.7.13, PhantomJS 2.1

+0

Je pense que cela est un problème de PhantomJS systémique: il est tout simplement pas le rendu la page et/ou les éléments SVG correctement. –

+0

J'ai des problèmes similaires lors de l'exécution de ma suite de tests avec phantomjs au lieu de chrome. Dans mon cas, ce délai expire aussi sur une simple demande driver.get (...). Mais je reçois cette erreur uniquement sur Ubuntu. Sur les fenêtres ça fonctionne bien. Étrange ... – powerpete

+0

Avez-vous trouvé quelque chose? – powerpete

Répondre

0

J'ai des problèmes similaires avec phatnomjs quand driver.get (..) doesn ne commencez pas à charger le contenu de la page Web. Spécialement lorsque le site cible effectue lui-même un window.location.reload() phantomjs arrête souvent de charger la nouvelle page.

Solution avec PhantomJS

  1. Réglage de la pageloadtimeout
  2. Répétez la requête get quand je reçois l'erreur de délai d'attente pageload.

Dans mon implémentation de noeud, cela ressemble à ceci. Je pense que l'API python est similaire.

//Setting the pageload timeout 
browser.manage().timeouts().pageLoadTimeout(10000); 
... 
driver.get(url).then(function() { 
    ok(); 
}, function() { 
    //We Retry it a second time 
    driver.get(url).then(function() { 
     ok(); 
    }, function (err) { 
     nok(err); 
    }); 
}); 

Alternative à PhantomJS

Quelques infos sur le cycle de vie de PhantomJS: https://github.com/ariya/phantomjs/issues/15105

Le passage à Chrome Headless est possible maintenant et ce serait une véritable alternative à WebDriver/PhantomJS.

À partir de chrome en mode sans tête est facile avec le plus récent chromedriver/chrome (sorry.Again un code js et non python):

var Options = require('selenium-webdriver/chrome').Options; 
var options = new Options(); 
options.addArguments('headless'); 
options.addArguments('disable-gpu'); 
options.addArguments('window-size=1200,1100'); 

browser = builder.forBrowser('chrome').setChromeOptions(options).build();