Me gustaría poder saber si un sitio le permite cargar archivos. Puedo pensar en dos formas principales en que los sitios lo hacen e idealmente me gustaría poder detectar ambos:
La documentación de PhantomJS tiene este fragmento de código de ejemplo:
var webPage = require('webpage'); var page = webPage.create(); page.uploadFile('input[name=image]', '/path/to/some/photo.jpg'); pero no está claro cómo pude darme cuenta de que input[name=image] realmente admite la carga.
Actualmente, mis rastreadores siguen todos los enlaces y botones de los sitios, pero no estoy seguro de cómo detectar que "se ha abierto una ventana emergente de carga de archivos". El caso de D&D es aún menos claro para mí. Necesito una solución para una sola página y obviamente puedo ir y aplicarla a cada página que paso.
ACTUALIZAR Resulta que la mayoría de las veces esto funciona:
document.querySelector('input[type=file]').click() Sin embargo, no siempre se puede hacer clic en las áreas de D&D y no siempre se puede asumir [ondrop] estará presente. A veces, el drop listener se agrega en el código:
object.addEventListener("drop", myScript);¿Cómo puedo verificar la presencia de tales elementos entonces?
Puede comprobar si un formulario tiene enctype="multipart/form-data" o no. o busque entrada con type=file en la página html.
AFAIK, el mejor enfoque para cargar archivos con selenio es enviar el archivo que se cargará directamente al elemento ubicado por este CSS Selector input[type=file] .
Entonces, para verificar si alguna página web admite la carga de archivos, puede verificar si esa página contiene el elemento input[type=file] .
Este elemento normalmente no es visible y no se puede interactuar con la GUI, por lo que solo puede verificar su existencia, no su visibilidad, etc.
Nada puede obtener el 100%, pero creo que el 99% funciona con input[type=file] a menos que el usuario no lo haya creado en tiempo de ejecución usando javascript.
O puede verificar el enctype del formulario, pero tampoco siempre funciona, ya que existe una buena posibilidad de que el usuario comprima y cambie el archivo a base64, entonces no habrá necesidad de que el enctype sea multipart/form-data. Entonces input[type=file] es la mejor manera.