tutorial pruebas español automatizadas python selenium selenium-webdriver drop-down-menu webdriverwait

python - español - pruebas automatizadas selenium



Mensaje: El elemento<opción> no se pudo desplazar a la vista al intentar hacer clic en una opción dentro de un menú desplegable a través de Selenium (2)

Este mensaje de error ...

selenium.common.exceptions.ElementNotInteractableException: Message: Element <option> could not be scrolled into view.

... implica que el elemento <option> el que su programa estaba tratando de interactuar no se pudo desplazar a la vista.

El HTML del elemento deseado nos hubiera dado una idea del error. Sin embargo, parece que el elemento deseado no era clickable / dentro de la Viewport . Para resolver el problema, debe inducir a WebDriverWait para que se pueda hacer clic en el elemento y puede usar la siguiente solución:

mySelectElement = browser.find_element_by_id(''providerTypeDropDown'') dropDownMenu = Select(mySelectElement) WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//select[@id=''providerTypeDropDown'']//options[contains(.,''Professional'')]"))) dropDownMenu.select_by_visible_text(''Professional'')

Nota : Tienes que agregar las siguientes importaciones:

from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.select import Select

Estoy tratando de seleccionar un menú desplegable y elegir una opción. Estoy usando la última versión de Selenium, la última versión de Firefox, la última versión de geckodriver y la última versión de Python.

Aquí está mi problema: cuando intento elegir una opción, me da el siguiente error:

selenium.common.exceptions.ElementNotInteractableException: Message: Element <option> could not be scrolled into view.

He intentado varias formas de circunnavegar este problema, pero ninguna parece funcionar. Estos son algunos de los enfoques que probé.

mySelectElement = browser.find_element_by_id(''providerTypeDropDown'') dropDownMenu = Select(mySelectElement) dropDownMenu.select_by_visible_text(''Professional'') mySelectElement = browser.find_element_by_id(''providerTypeDropDown'') dropDown = Select(mySelectElement) for option in dropDown.options: message = option.get_attribute(''innerText'') print(message) if message == ''Professional'': print("Exists") dropDown.select_by_visible_text(message) break element = browser.find_element_by_id(''providerTypeDropDown'') browser.execute_script("var select = arguments[0]; for(var i = 0; i < select.options.length; i++){ if(select.options[i].text == arguments[1]){ select.options[i].selected = true; } }", element, "Professional")

El código HTML sigue las etiquetas de selección y las etiquetas de opción habituales. Cualquier ayuda es apreciada. El código HTML se incluye a continuación.

<select data-av-chosen="providerTypes" id="providerTypeDropDown" data-placeholder="Please Select a Provider Type" name="providerTypeDropDown" class="chzn-select input-full ng-pristine chzn-done ng-invalid ng-invalid-provider-type" data-ng-options="providerType.value for providerType in request.models.providerTypes" data-ng-model="request.models.providerType" data-av-validator-field="providerType" data-disable-search-threshold="5" style="display; none;"> <option value="" class="">Please Select a Provider Type</option> <option value="0">Professional</option> <option value="1">Institutional</option> </select>

Las declaraciones de impresión están ahí para pruebas / rastreo de código a propósito.


Intenta añadir una espera:

mySelectElement = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "providerTypeDropDown"))) mySelectElement.click()

esperará al menos 10 segundos hasta que se pueda hacer clic en el elemento y luego haga clic.

Tampoco veo en su código que haga clic en el botón desplegable, que abre el menú desplegable. Localice este botón, también agregue una espera y haga clic en él antes de seleccionar la opción. Espero eso ayude.

Nota: para este código tienes que agregar algunas importaciones:

from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC