python - macosx - phantomjsdriver
¿Hay alguna manera de usar PhantomJS en Python? (8)
Quiero usar PhantomJS en Python . Busqué en Google este problema pero no pude encontrar soluciones adecuadas.
Creo que os.popen()
puede ser una buena opción. Pero no pude pasarle algunos argumentos.
Utilizar subprocess.Popen()
puede ser una solución adecuada por ahora. Quiero saber si hay una mejor solución o no.
¿Hay alguna manera de usar PhantomJS en Python?
Ahora, desde que GhostDriver viene con PhantomJS, se ha vuelto aún más conveniente usarlo a través de Selenium.
Probé la instalación de PhantomJS en el nodo, como lo sugirió Pykler, pero en la práctica encontré que era más lenta que la instalación independiente de PhantomJS. Supongo que la instalación independiente no proporcionó estas características anteriormente, pero a partir de la v1.9, lo hace en gran medida.
- Instale PhantomJS ( http://phantomjs.org/download.html ) (Si está en Linux, las siguientes instrucciones lo ayudarán a https://.com/a/14267295/382630 )
- Instale Selenium utilizando pip.
Ahora puedes usar así
import selenium.webdriver
driver = selenium.webdriver.PhantomJS()
driver.get(''http://google.com'')
# do some processing
driver.quit()
Así es como pruebo javascript utilizando PhantomJS y Django:
mobile / test_no_js_errors.js :
var page = require(''webpage'').create(),
system = require(''system''),
url = system.args[1],
status_code;
page.onError = function (msg, trace) {
console.log(msg);
trace.forEach(function(item) {
console.log('' '', item.file, '':'', item.line);
});
};
page.onResourceReceived = function(resource) {
if (resource.url == url) {
status_code = resource.status;
}
};
page.open(url, function (status) {
if (status == "fail" || status_code != 200) {
console.log("Error: " + status_code + " for url: " + url);
phantom.exit(1);
}
phantom.exit(0);
});
mobile / tests.py :
import subprocess
from django.test import LiveServerTestCase
class MobileTest(LiveServerTestCase):
def test_mobile_js(self):
args = ["phantomjs", "mobile/test_no_js_errors.js", self.live_server_url]
result = subprocess.check_output(args)
self.assertEqual(result, "") # No result means no error
Ejecutar pruebas :
manage.py test mobile
En caso de que esté utilizando Buildout , puede automatizar fácilmente los procesos de instalación que Pykler describe usando la receta gp.recipe.node .
[nodejs]
recipe = gp.recipe.node
version = 0.10.32
npms = phantomjs
scripts = phantomjs
Esa parte instala node.js como binario (al menos en mi sistema) y luego usa npm para instalar PhantomJS. Finalmente, crea un punto de entrada bin/phantomjs
, con el que puede llamar al controlador web de PhantomJS. (Para instalar Selenium, debe especificarlo en sus requisitos de Egg o en la configuración de Buildout).
driver = webdriver.PhantomJS(''bin/phantomjs'')
La forma más fácil de usar PhantomJS en python es a través de Selenium. El método de instalación más simple es
- Instala NodeJS
- Usando el administrador de paquetes de Node, instale phantomjs:
npm -g install phantomjs-prebuilt
- instale selenium (en su virtualenv, si lo está usando)
Después de la instalación, puede usar phantom tan simple como:
from selenium import webdriver
driver = webdriver.PhantomJS() # or add to your PATH
driver.set_window_size(1024, 768) # optional
driver.get(''https://google.com/'')
driver.save_screenshot(''screen.png'') # save a screenshot to disk
sbtn = driver.find_element_by_css_selector(''button.gbqfba'')
sbtn.click()
Si la variable de entorno de la ruta del sistema no está configurada correctamente, deberá especificar la ruta exacta como un argumento para webdriver.PhantomJS()
. Reemplace esto:
driver = webdriver.PhantomJS() # or add to your PATH
... con lo siguiente:
driver = webdriver.PhantomJS(executable_path=''/usr/local/lib/node_modules/phantomjs/lib/phantom/bin/phantomjs'')
Referencias:
La respuesta de @Pykler es excelente, pero el requisito de Nodo no está actualizado. Los comentarios en esa respuesta sugieren la respuesta más simple, que he puesto aquí para ahorrar tiempo a otros:
Instala PhantomJS
Como señala @ Vivin-Paliath, es un proyecto independiente, que no forma parte de Node.
Mac:
brew install phantomjs
Ubuntu:
sudo apt-get install phantomjs
etc
Configura un
virtualenv
(si aún no lo has hecho):virtualenv mypy # doesn''t have to be "mypy". Can be anything. . mypy/bin/activate
Si su máquina tiene Python 2 y 3, es posible que necesite ejecutar
virtualenv-3.6 mypy
o similar.Instalar selenio:
pip install selenium
Prueba una prueba simple, como esta tomada de los docs :
from selenium import webdriver from selenium.webdriver.common.keys import Keys driver = webdriver.PhantomJS() driver.get("http://www.python.org") assert "Python" in driver.title elem = driver.find_element_by_name("q") elem.clear() elem.send_keys("pycon") elem.send_keys(Keys.RETURN) assert "No results found." not in driver.page_source driver.close()
PhantomJS recientemente eliminó el soporte de Python por completo. Sin embargo, PhantomJS ahora incorpora Ghost Driver .
Desde entonces, se ha ghost.py
un nuevo proyecto para llenar el vacío: ghost.py
. Probablemente quieras usar eso en su lugar:
from ghost import Ghost
ghost = Ghost()
with ghost.start() as session:
page, extra_resources = ghost.open("http://jeanphi.me")
assert page.http_status==200 and ''jeanphix'' in ghost.content
Si usa Anaconda, instale con:
conda install PhantomJS
en su guión:
from selenium import webdriver
driver=webdriver.PhantomJS()
funciona perfectamente.
esto es lo que hago, python3.3. Estaba procesando grandes listas de sitios, por lo que fallar en el tiempo de espera fue vital para que el trabajo se ejecutara en toda la lista.
command = "phantomjs --ignore-ssl-errors=true "+<your js file for phantom>
process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)
# make sure phantomjs has time to download/process the page
# but if we get nothing after 30 sec, just move on
try:
output, errors = process.communicate(timeout=30)
except Exception as e:
print("/t/tException: %s" % e)
process.kill()
# output will be weird, decode to utf-8 to save heartache
phantom_output = ''''
for out_line in output.splitlines():
phantom_output += out_line.decode(''utf-8'')