support please macosx has for example been python macos selenium selenium-webdriver phantomjs

please - selenium phantomjs python



Cómo detener correctamente la ejecución de phantomjs (7)

¿Cuál es el sistema operativo que estás usando? Creo que corresponde al caso de la siguiente, si está utilizando el sistema operativo POSIX.

Creo solicitud de extracción, pero rechazó. https://github.com/SeleniumHQ/selenium/pull/2244

Pero creo que obviamente es correcto. Por lo tanto, emití un problema. https://github.com/SeleniumHQ/selenium/issues/2272

La causa de este problema es que el método final del modo fantasma phatmojs es incorrecto. No es usar la API de apagado del modo fantasma phantomjs al final.

En el caso de phantomjs que instaló en npm en Linux o OSX, A selenium llame a Popen para phantomjs, A phantomjs call spawn para lib / phantomjs.js. En este momento, un selenio es uno de los padres, un phantomjs es un niño, y lib / phantomjs.js es un nieto.

Usted llama a quit () en el padre (selenio), envía SIGTERM a child (phantomjs). y un hijo (phantomjs) envía SIGTERM a nieto (lib / phantomjs.js) en la función del controlador SIGTERM del niño.

Un nieto será zombie cuando los padres envíen SIGKILL al niño antes de que el niño envíe SIGTERM al nieto.

Esta solicitud de extracción ttps: //github.com/SeleniumHQ/selenium/pull/2244 se cerrará con la aplicación de apagado del modo de controlador fantasma.

def send_remote_shutdown_command(self): super(Service, self).send_remote_shutdown_command() ## ADD A NEW LINE HERE if self._cookie_temp_file: os.close(self._cookie_temp_file_handle) os.remove(self._cookie_temp_file)

Otras soluciones, dormir entre "self.process.ternimate ()" y "self.process.kill ()". ttps: //github.com/SeleniumHQ/selenium/blob/051c8b110a1aec35247cd45fa4db85c6e522cdcb/py/selenium/webdriver/common/service.py#L151-L153

self.process.terminate() time.sleep(1) ## ADD A NEW LINE HERE self.process.kill() self.process.wait()

phantomjs y phantomjs en Python con lo siguiente

from selenium import webdriver driver = webdriver.PhantomJS() driver.get(url) html_doc = driver.page_source driver.close()

sin embargo, después de que el script finaliza la ejecución, todavía encuentro una instancia de phantomjs en mi Mac Activity Monitor. Y, de hecho, cada vez que ejecuto el script, se crea un nuevo proceso phantomjs .

¿Cómo debo cerrar el controlador?


A partir de julio de 2016, driver.close() y driver.quit() no fueron suficientes para mí. Eso acabó con el proceso del node , pero no con el proceso infantil phantomjs que generó.

Después de la discusión sobre este tema de GitHub , la única solución que funcionó para mí fue ejecutar:

import signal driver.service.process.send_signal(signal.SIGTERM) # kill the specific phantomjs child proc driver.quit() # quit the node proc


Estaba teniendo un problema similar en la máquina de Windows. No tuve suerte con ninguno

driver.close()

o

driver.quit()

en realidad cerrando la ventana PhantomJS, pero cuando utilicé ambas, la ventana PhantomJS finalmente se cerró y salió correctamente.

driver.close() driver.quit()


No se garantiza que el método .close() libere todos los recursos asociados con una instancia de controlador. Tenga en cuenta que estos recursos incluyen, pero no se limitan a, el ejecutable del controlador (PhantomJS, en este caso). El método .quit() está diseñado para liberar todos los recursos de un controlador, incluida la salida del proceso ejecutable.


También tengo una secuencia de comandos python ejecutándose en mi mac usando selenio para hacer algunas cosas usando PhantomJS como el controlador de la web.

Cuando mi prueba se está ejecutando, hay tres procesos para notar que están aquí:

$ ps -ef | grep [p]hantomjs 501 28085 24925 0 9:03pm ttys002 0:00.34 python test.py 501 28088 28085 0 9:03pm ttys002 0:00.14 node /usr/local/bin/phantomjs --cookies-file=/var/folders/nq/hjz03w6d4fs620197d_zwg0m0000gn/T/tmp8xLNaH --webdriver=55075 501 28090 28088 0 9:03pm ttys002 0:00.71 /usr/local/lib/node_modules/phantomjs/lib/phantom/bin/phantomjs --cookies-file=/var/folders/nq/hjz03w6d4fs620197d_zwg0m0000gn/T/tmp8xLNaH --webdriver=55075

Tenga en cuenta la segunda columna, que son los números de proceso, y la tercera, que son los procesos padre. Mi script de prueba es el padre. Hay un proceso de nodo que tiene mi script de prueba como padre, luego hay otro proceso PhantomJS cuyo padre es el proceso del nodo. No me preguntes por qué hay dos procesos PhantomJS, supongo que así es cómo está diseñado para funcionar.

De todos modos, en el monitor de actividad de mi mac, puedo ver esto:

Tenga en cuenta el número PID 28090.

Después de que mi prueba termine de ejecutar esto, los procesos se ciernen, igual que tú también. Si compruebo si aún se están ejecutando procesos, puedo ver:

$ ps -ef | grep [p]hantomjs 501 28090 1 0 9:03pm ttys002 0:18.93 /usr/local/lib/node_modules/phantomjs/lib/phantom/bin/phantomjs --cookies-file=/var/folders/nq/hjz03w6d4fs620197d_zwg0m0000gn/T/tmp8xLNaH --webdriver=55075

Entonces me parece que driver.quit() sale del proceso del nodo, el que tiene el número PID 28088, pero deja a su hijo huérfano. No sé si esto es intencional. Si no es intencional, entonces creo que no hay una forma "adecuada" de salir de este proceso en tu código.

Por lo tanto, utilizaría el equivalente de kill -9 28090 de su idioma kill -9 28090 , justo después de driver.quit()


Tenga en cuenta que esto obviamente causará problemas si tiene varios hilos / procesos que inician PhantomJS en su máquina.

He visto a varias personas luchar con el mismo problema, pero para mí, la solución más simple / hack fue ejecutar lo siguiente desde la línea de comando a través de Python DESPUÉS de haber invocado a driver.close() o driver.quit() :

pgrep phantomjs | xargs kill


driver.quit() no funcionó para mí en Windows 10, así que terminé agregando la siguiente línea justo después de llamar a driver.close() :

os.system(''taskkill /f /im phantomjs.exe'')

dónde

/f = force /im = by image name

Y dado que esta es una solución única de Windows, puede ser inteligente ejecutar solo si os.name == ''nt''