Tengo este polyfill en JS para mi sitio:
if (!Date.prototype.toSQLDate) { console.log('Adding my custom polyfill'); Date.prototype.toSQLDate = function () { // relevant code snipped, but assume: // return some string like '2000-01-01'; } }Cuando cargo el sitio web manualmente, veo el registro de la consola y puedo hacer:
var x = new Date(2000, 0, 1); console.log(x.toSQLDate()) => '2000-01-01'Esto funciona tanto en Chrome/Chromium(96) como en Firefox(95+)
Sin embargo, cuando ejecuto mis pruebas automatizadas en este sitio web, solo en Firefox (95) (Chrome funciona bien) obtengo esto cuando intento ejecutar el mismo código a través de webdriver.execute_script
from selenium import webdriver wd = webdriver.Firefox() wd.get(...myurl) wd.execute_script('var x = new Date(2000, 0, 1); return x.toSQLDate()') >>>> selenium.common.exceptions.JavascriptException: Message: TypeError: x.toSQLDate is not a function¿Qué? Si observo la prueba automatizada con la consola abierta, puedo ver mi archivo console.log que me dice que agregó correctamente el polyfill. Puedo interactuar con el navegador en la consola y hacer exactamente la misma lógica y recuperar una cadena válida. Pero cuando webdriver lo ejecuta, ¿no está en el mismo contexto js? Y solo en Firefox.
Este comportamiento está presente tanto en Python2.7/selenium3 como en Python3.8/selenium4
¿Que esta pasando aqui? ¿Necesito habilitar algún tipo de escape sandbox js en Firefox?
Información Adicional:
Parece que puede haber alguna "peculiaridad" en la forma en que firefox/geckodriver trata los globales. Considere este simple script:
from selenium import webdriver ff = webdriver.Firefox() ff.get('http://www.google.com') ff.execute_script('return Date === window.Date') => False ff.execute_script('console.log(Date === window.Date)') => false # But this same script shows true for chrome.