2014-11-25 6 views
9

Wenn ich einen Screenshot mit PhantomJS als Webdriver in Selenium mache, bekomme ich nur einen transparenten Hintergrund. Irgendein Hinweis warum? Es funktioniert mit Seiten wie Google.com, aber nicht mit kahoot.it, die ich möchte. Es funktioniert auch mit allem, was ich in Firefox brauche, aber nicht in PhantomJS. Transparenter Screenshot mit PhantomJS in Selenium [Python]?

from selenium import webdriver 
from selenium.webdriver.common.keys import Keys 
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities 
import time 

dcap = dict(DesiredCapabilities.PHANTOMJS) 
dcap["phantomjs.page.settings.userAgent"] = ("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36") 

Dies ist der Code

driver = webdriver.PhantomJS(desired_capabilities=dcap) 
time.sleep(12) 
driver.set_window_size(1024, 768) 
driver.get('http://www.kahoot.it') 

driver.save_screenshot('testing.png') 

Jede Hilfe wäre sehr willkommen! :)

+3

Nicht so vertraut mit Selen und PhantomJS.aber das scheint relevant. 'PhantomJS legt die Hintergrundfarbe der Webseite überhaupt nicht fest, es bleibt der Seite überlassen, über deren Hintergrundfarbe zu entscheiden. Wenn die Seite nichts setzt, bleibt sie transparent. "[PhantomJS FAQ] (http://phantomjs.org/faq.html) – Himal

+0

Ich kann keinen transparenten Hintergrund auf Windows oder Linux mit 1.9.7 und 1.9.8 reproduzieren . –

+0

Wow, du hattest eigentlich recht. Ich benutze einen Mac auf Yosemite und ich installierte eine VM mit Windows 8, nur um es zu testen. Alles hat einwandfrei funktioniert; der Rest des Codes auch. Verstehe nicht wirklich warum, aber vielen Dank! :) –

Antwort

6

Ihr Problem betrifft Ihre Website.

Sie tippten es als http://www.kahoot.it, aber am Ende wird es auf https Website umleiten. Also, Ihr PhantomJS bekommt Fehler von ssl Version oder ssl selbst, wenn wo Fehler.

Ändern Sie Ihren webdriver.PhantomJS() zu dem: driver = webdriver.PhantomJS(desired_capabilities=dcap, service_args=['--ignore-ssl-errors=true', '--ssl-protocol=any', '--web-security=false']) und alle sollten in Ordnung laufen.

Auf der anderen Seite, wenn Sie nicht mögen transparenten Hintergrund Ihre eigenen mit: driver.execute_script('document.body.style.background = "black"').

Mit dem ersten Beispiel sehen Sie nur linken Rahmen geschwärzt, das ist, weil ein Top-Element auf weißem Hintergrund festgelegt wurde. Auf dem Kahoot-Beispiel können Sie es nicht festlegen, da diese Webseite über ein eigenes JavaScript-Autowechsel-Skript verfügt. Sie sollten es entfernen, bevor Sie es ändern, andernfalls wird Ihre Einstellung bald oder später aufgehoben.

Voll Code, bereit zu laufen:

#!/usr/bin/env python 
#! -*- coding: utf-8 -*- 

import os 
import selenium 
from selenium import webdriver 
from selenium.webdriver.common.keys import Keys 
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities 
import time 

dcap = dict(DesiredCapabilities.PHANTOMJS) 
dcap["phantomjs.page.settings.userAgent"] = ("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36") 


driver = webdriver.PhantomJS(desired_capabilities=dcap, service_args=['--ignore-ssl-errors=true', '--ssl-protocol=any', '--web-security=false']) 
driver.set_window_size(1024, 768) 
driver.get('http://www.httpbin.org') 
time.sleep(2) 
driver.execute_script('document.getElementsByClassName("mp")[0].style.background = "green"') 
#driver.execute_script('document.body.style.background = "black"') 
driver.save_screenshot('testing1.png') 

driver.get('http://www.kahoot.it') 
time.sleep(2) 
driver.execute_script("var body = document.getElementsByTagName('body')[0]; body.setAttribute('background-color', 'white')") 
driver.execute_script('document.body.style.background = "black"') 
driver.save_screenshot('testing2.png') 

Als Anregung für andere transparente Fragen, wenn Sie wollen nicht für DOM Elemente aussehen, konvertieren Sie einfach Ihre PNG-Bild-Klasse für Python jpg und jeden transparent Pixel würde auf Weiß gesetzt werden.