Tener este botón:
<button id="btn-login-5" type="button" class="m-1 btn btn-warning" disabled="">Update</button>Quiero eliminar el atributo de desactivación para poder hacer clic en el botón.
Este es el código que veo cada vez:
button = self.driver.find_element( By.XPATH, "/html/body/div/div/button") self.driver.execute_script( 'arguments[0].removeAttribute("disabled");', button)Pero no puedo entender cómo puede funcionar eso para alguien, quiero decir, si el elemento está deshabilitado, Selenium no puede ejecutar esa primera línea, no puede asignar el "botón" var porque no puede encontrar ese elemento .
¿Me estoy perdiendo de algo? Recibo este error si ejecuto eso:
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"/html/body/div/div/button"}Me acabo de dar cuenta de que esto está relacionado con la cuadrícula de selenio, traté de hacer clic en el botón de muchas maneras, y nadie funciona, pero si en lugar de usar la cuadrícula de selenio uso un controlador web local, ¡todos funcionan! Así que no tengo idea de qué hacer ahora.
Si usa este xpath relativo, en lugar de uno absoluto, funciona:
button = driver.find_element(By.XPATH, "//button[@type='button']")¿Pero es este el único botón en tu DOM? De lo contrario, es posible que deba agregarle otras entidades relativas.
Código refactorizado (según la información de consulta proporcionada):
button = driver.find_element(By.XPATH, "//button[@type='button']") driver.execute_script('arguments[0].removeAttribute("disabled");', button) button.click()Producción:
Process finished with exit code 0El atributo disabled se puede configurar para evitar que un usuario haga clic en el botón hasta que se cumpla alguna otra condición (como seleccionar una casilla de verificación, etc.). Luego, un JavaScript podría eliminar el valor deshabilitado y volver a hacer clic en el botón.
Estabas lo suficientemente cerca. Para eliminar el atributo disabled , el elemento Actualizar aún se puede identificar por su presencia utilizando la siguiente estrategia de localización :
button = WebDriverWait(self.driver, 20).until(EC.presence_of_element_located((By.XPATH, "//button[@class='m-1 btn btn-warning' and text()='Update']"))) self.driver.execute_script('arguments[0].removeAttribute("disabled");', button)Todo funciona bien, el problema es otro, mi código no pudo encontrar el elemento porque el elemento no estaba allí, algo muy extraño, tengo un docker con el servidor de la página y si abro la página puedo ver el botón pero el controlador web de la cuadrícula de selenio no carga el botón en absoluto, no sé por qué, tal vez ese botón depende de algún servidor al que no se puede acceder desde el controlador web.
Le pediré esto al desarrollador de la página, pero el código era bueno :)
Perdí un día completo de trabajo por nada :)