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