javascriptexecutor - ¿Cómo deshabilitar Javascript cuando se usa Selenium?
javascriptexecutor selenium c# (12)
Me pregunto cómo puedo deshabilitar javascript cuando uso Selenium para poder probar la validación del lado del servidor.
Encontré este artículo pero no sé qué hacer realmente. Como hago este archivo javascript entonces que?
http://thom.org.uk/2006/03/12/disabling-javascript-from-selenium/
Editar
Mientras tanto surgieron mejores alternativas, consulte las otras respuestas, por ejemplo, https://.com/a/7492504/47573 .
Respuesta original
Otras posibilidades serían:
- Escriba su aplicación para admitir la desactivación de JavaScript (sí, la aplicación web ).
¿Suena loco? No es En nuestro proceso de desarrollo, estamos haciendo exactamente esto, implementando características sin JS hasta que todos estén ahí, luego condiméntelo con JS. Por lo general, proporcionamos un gancho dentro de todas las plantillas que pueden controlar desde un solo punto hasta básicamente qué JS está activado / desactivado desde la propia aplicación web. Y, sí, la aplicación es difícilmente reconocible sin JS habilitado, pero es la mejor manera de garantizar que las cosas funcionen correctamente. Incluso escribimos pruebas de Selenium para ello, para ambas versiones; NOJS y JS. Los NOJS se implementan tan rápidamente que no importan en comparación con lo que se necesita para escribir pruebas JS sofisticadas ... - Modifique el perfil de navegador apropiado para tener JS deshabilitado. Es decir, para FF puedes decirle a Selenium qué perfil usar; normalmente puede cargar este perfil, deshabilitar JS en about: config y enviar este perfil como perfil predeterminado a Selenium RC.
A partir de 2018, las soluciones anteriores no funcionaron para Firefox 61.0.1
y geckodriver 0.20.1
.
Y aquí hay una solución que funciona.
from selenium import webdriver
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
browser_exe = ''/path/to/firefox/exe''
browser_driver_exe = ''/path/to/geckodriver/exe''
firefox_binary = FirefoxBinary(browser_exe)
profile = webdriver.FirefoxProfile()
profile.DEFAULT_PREFERENCES[''frozen''][''javascript.enabled''] = False
profile.set_preference("app.update.auto", False)
profile.set_preference("app.update.enabled", False)
profile.update_preferences()
driver = webdriver.Firefox(
executable_path=browser_driver_exe,
firefox_binary=firefox_binary,
firefox_profile=profile,
)
driver.get("about:config")
Ahora en la barra de búsqueda escriba javascript
y debería ver lo siguiente.
A veces, profile.set_preference ("javascript.enabled", False) no funciona en Firefox. Utilice el pitón de abajo para evitar esto:
from pyvirtualdisplay import Display
from selenium import webdriver
from selenium.webdriver.firefox.firefox_profile import FirefoxProfile
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
profile = webdriver.FirefoxProfile()
profile.update_preferences() #May or may not be needed
display = Display(visible=0, size=(1200, 800))
display.start()
browser = webdriver.Firefox(profile)
browser.get("about:config")
actions = ActionChains(browser)
actions.send_keys(Keys.RETURN)
actions.send_keys("javascript.enabled")
actions.perform()
actions.send_keys(Keys.TAB)
actions.send_keys(Keys.RETURN)
actions.send_keys(Keys.F5)
actions.perform()
browser.quit()
display.stop()
Esta es la respuesta simple, por lo menos para python.
from selenium import webdriver
profile = webdriver.FirefoxProfile()
profile.set_preference("javascript.enabled", False);
driver = webdriver.Firefox(profile)
Esta es una forma de hacerlo si usa WebDriver con FireFox:
FirefoxProfile p = new FirefoxProfile();
p.setPreference("javascript.enabled", false);
driver = new FirefoxDriver(p);
Estaba tratando de resolver este problema y encontré este blog, pero la primera publicación tiene un enlace que ya no es válido. Pero finalmente encontré el código para colocar dentro del usuario-extensions.js que funciona. Aquí está:
Selenium.prototype.doDisableJavascript = function() {
setJavascriptPref(false);
};
Selenium.prototype.doEnableJavascript = function() {
setJavascriptPref(true);
};
function setJavascriptPref(bool) {
prefs = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefBranch);
prefs.setBoolPref("javascript.enabled", bool);
}
Espero que esto ahorre el tiempo que me tomó encontrarlo.
Establezca el nombre del navegador en la configuración de selenio en htmlunit
.
Este es un controlador que tiene JavaScript deshabilitado de forma predeterminada https://code.google.com/p/selenium/wiki/HtmlUnitDriver . El JavaScript requerido para que el selenio interactúe con la página aún podrá ejecutarse.
Los pasos para usar el script al que se hace referencia anteriormente no están mal:
- Cree el archivo "user-extensions.js" de selenio como se menciona en el artículo que vincula.
- Seleccione su archivo "user-extensions.js" en las preferencias de Selenium en Opciones-> Opciones.
- Use el script seleccionando el comando "DisableJavascript" o "EnableJavascript" de la lista de comandos (o simplemente escríbalo manualmente).
Para ver ejemplos de capturas de pantalla de los pasos 2 y 3, consulte: http://i32.tinypic.com/161mgcm.jpg
Actualización: Para obtener información sobre el uso de user-extensions.js con Selenium RC, intente la siguiente URL: http://seleniumhq.org/docs/08_user_extensions.html
No es necesario deshabilitar JavaScript. Si completa su formulario, puede usar JavaScript para enviarlo, por ejemplo, use runScript
y window.document.forms[0].submit()
.
Cada vez que llama a submit()
directamente en un formulario, el formulario se envía directamente al servidor, no se activa el evento onsubmit y, por lo tanto, no hay validación del lado del cliente. (A menos que su acción de formulario sea algo como javascript:validateForm()
, en cuyo caso su sistema no funciona cuando JavaScript está deshabilitado).
Parece que la creación de este archivo le dará las funciones que necesita para deshabilitar javascript para su prueba. Llamará a la función "doDisableJavascript" antes de comenzar la prueba y a la función "doEnableJavascript" cuando desee habilitarla nuevamente.
Puede deshabilitar el JavaScript durante el tiempo de ejecución utilizando el código:
WebDriver driver = new FirefoxDriver();
driver.get("about:config");
Actions act = new Actions(driver);
act.sendKeys(Keys.RETURN).sendKeys("javascript.enabled").perform();
Thread.sleep(1000);
act.sendKeys(Keys.TAB).sendKeys(Keys.RETURN).sendKeys(Keys.F5).perform();
Sustituyo este parámetro en la configuración de Opciones (), no recuerdo de quién lo espié (para alguien en SO), pero funciona:
from selenium.webdriver.firefox.options import Options
options = Options()
options.preferences.update({''javascript.enabled'': False})
browser = webdriver.Firefox(options=options)
Selenium 3.14 y Firefox 63.0