2
votes

Comment sélectionner plusieurs options dans la liste de sélection multiple en utilisant Selenium-Python?

J'essaie de sélectionner P0_ENGLISH , P1_ENGLISH , P5_ENGLISH parmi plusieurs sélections qui ont 10 options. Je souhaite sélectionner uniquement ces 3 options.

CODE HTML:

selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document

CODE SELENIUM-PYTHON:

queues = Select(driver.find_element_by_css_selector(".rowStyle1:nth-child(6) .gwt-ListBox"))
queues.select_by_visible_text("P0_English")
time.sleep(3)
queues.select_by_visible_text("P1_English")
time.sleep(3)
queues.select_by_visible_text("P5_English"

J'ai essayé d'utiliser ce code. Avec ce code, je suis en mesure de sélectionner la première option à savoir "P0_ENGLISH". Cependant, après avoir sélectionné la première option, j'obtiens une erreur:

<select multiple="" class="gwt-ListBox" style="height: 80px; width: 205px;">
    <option title="Generic_Eng" value="Generic_Eng">Generic_Eng</option>
    <option title="Generic_Hindi" value="Generic_Hindi">Generic_Hindi</option>
    <option title="P0_English" value="P0_English">P0_English</option>
    <option title="P0_Hindi" value="P0_Hindi">P0_Hindi</option>
    <option title="P1_English" value="P1_English">P1_English</option>
    <option title="P1_Hindi" value="P1_Hindi">P1_Hindi</option>
    <option title="P4_English" value="P4_English">P4_English</option>
    <option title="P4_Hindi" value="P4_Hindi">P4_Hindi</option>
    <option title="P5_English" value="P5_English">P5_English</option>
    <option title="P5_Hindi" value="P5_Hindi">P5_Hindi</option>
</select>


1 commentaires

essayez element = WebDriverWait (pilote, 10) .until (EC.presence_of_element_located ((By.xpath, title = "P0_English"))


4 Réponses :


2
votes

Dans le contexte de Selenium, une référence est périmée lorsque la référence n'est pas valide, car l'élément référencé a été supprimé, ou obsolète car l'élément a été détaché puis attaché par un client scénario. Sans connaître les mécanismes précis du script client, il peut y avoir différentes solutions. Le plus simple est de tenter à nouveau de référencer l'élément, c'est-à-dire

queues = Select(driver.find_element_by_css_selector(".rowStyle1:nth-child(6).gwtListBox"))
queues.select_by_visible_text("P0_English")
time.sleep(3)
queues = Select(driver.find_element_by_css_selector(".rowStyle1:nth-child(6).gwtListBox"))
queues.select_by_visible_text("P1_English")
time.sleep(3)
queues = Select(driver.find_element_by_css_selector(".rowStyle1:nth-child(6).gwtListBox"))
queues.select_by_visible_text("P5_English")

Cela suppose que le sélecteur CSS reste le même après que la liste de sélection soit rattachée. Il est également possible que le sélecteur devienne invalide parce que l'élément a été supprimé ou son emplacement a été modifié. Dans le premier cas, vous voudrez lever une exception et la gérer de manière appropriée et, dans le second, découvrir ce que sera son nouveau sélecteur de manière empirique ou par analyse de code de script côté client. Pour en savoir plus sur StaleElementReferenceException ici .


0 commentaires

2
votes

Pour sélectionner plusieurs options à partir d'un élément Multi Select , vous pouvez utiliser ActionChains pour simuler le clic de contrôle comme suit :

from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys

myElemA = driver.find_element_by_css_selector(".rowStyle1:nth-child(6) .gwt-ListBox option[value='P0_English']")
myElemB = driver.find_element_by_css_selector(".rowStyle1:nth-child(6) .gwt-ListBox option[value='P1_English']")
myElemC = driver.find_element_by_css_selector(".rowStyle1:nth-child(6) .gwt-ListBox option[value='P5_English']")
ActionChains(driver).key_down(Keys.CONTROL).click(myElemA).key_up(Keys.CONTROL).perform()
ActionChains(driver).key_down(Keys.CONTROL).click(myElemB).key_up(Keys.CONTROL).perform()
ActionChains(driver).key_down(Keys.CONTROL).click(myElemC).key_up(Keys.CONTROL).perform()


0 commentaires

0
votes

L'OP consiste à sélectionner une partie des éléments dans la liste de sélection multiple, mais si vous souhaitez sélectionner tous les éléments de la liste, voici les options.

JavaScript: p >

elements = driver.find_elements_by_css_selector(".gwt-ListBox option")
for ele in elements:
    # select the item here

Pyhton

elements = driver.find_elements_by_css_selector(".gwt-ListBox option")
driver.execute_script("arguments[0].forEach(function(ele){ele.selected=true;});",elements)


0 commentaires

0
votes
For me:

Multi-select option present on Techlistic form site worked by below code when I used CSS Selector-

https://www.techlistic.com/p/selenium-practice-form.html

act=ActionChains(self.drv)
WE_cmd= self.drv.find_element(By.CSS_SELECTOR,'#selenium_commands > option:nth-child(2)' )
opt=Select(self.drv.find_element(By.ID,"selenium_commands"))
opt.select_by_visible_text("Browser Commands")
act.key_down ( Keys.CONTROL ).click ( WE_cmd).key_up ( Keys.CONTROL ).perform ()

1 commentaires

Veuillez modifier votre question afin que le formatage soit correct.