Python selenium select element from drop down. Element Not Visible Exception

拜拜、爱过 提交于 2020-03-05 05:05:55

问题


I'm trying to scrape the following website link

I need to automate the following steps:

1) Select the correct drop down table (the first on the left you see un the image below).

2) Select an option from the drop down menu (Caraibi option).

3) Click on the search button.

Drop down images: The first on the left ("Dove vuoi andare?").

The HTML code is the following one:

 <select name="ctl00$ctl00$ctl00$ctl37$g_7e88f2a7_c220_4ba6_8ca8_49ca1297d22a$cruiseFinderControl$ddl_MacroArea" onchange="javascript:setTimeout('__doPostBack(\'ctl00$ctl00$ctl00$ctl37$g_7e88f2a7_c220_4ba6_8ca8_49ca1297d22a$cruiseFinderControl$ddl_MacroArea\',\'\')', 0)" id="ctl00_ctl00_ctl00_ctl37_g_7e88f2a7_c220_4ba6_8ca8_49ca1297d22a_cruiseFinderControl_ddl_MacroArea" class="ddlMacroArea" tabindex="0">
        <option selected="selected" value="">Tutte le destinazioni</option>
        <option value="NORTHERN CAPITALS">Capitali Nordiche</option>
        <option value="EASTERN CARIBBEAN">Caraibi</option>
        <option value="MAR ROSSOARAB">Dubai/Emirati Arabi</option>
        <option value="NORWEGIAN FJORDS">Fiordi, Spitzbergen e Islanda</option>
        <option value="PACIFIC OCEAN">Giro del Mondo</option>
        <option value="WEST MEDITERRANEAN">Mediterraneo Occidentale</option>
        <option value="EAST MEDITERRANEAN">Mediterraneo Orientale</option>
        <option value="ATLANTIC OCEAN">Oceano Atlantico/Canarie</option>
        <option value="INDIAN OCEAN">Oceano Indiano, Maldive, Mauritius</option>
        <option value="ORIENTAL LANDS">Oriente</option>
        <option value="SOUTH AMERICA">Sud America</option>
        <option value="TRANSATLANTIC">Transatlantiche</option>

    </select>

Well I'm using this code:

 from selenium import webdriver
 from selenium.webdriver.support.ui import Select
 import time

 driver = webdriver.Chrome('path/to/the/driver.exe')
 driver.get('https://www.costacrociere.it/B2C/I/Pages/Default.aspx')
 driver.set_window_size(800, 660)
 time.sleep(2)
 select=Select(driver.find_element_by_id("ctl00_ctl00_ctl00_ctl37_g_7e88f2a7_c220_4ba6_8ca8_49ca1297d22a_cruiseFinderControl_ddl_MacroArea"))


 #view of the grappled options
 select.options

So until here i can get all the options (this is a part of them):

 [<selenium.webdriver.remote.webelement.WebElement 
 (session="7978296e5858040f56f27f3414087c60", element="0.7352996272394383-2")>, 
 <selenium.webdriver.remote.webelement.WebElement 
 (session="7978296e5858040f56f27f3414087c60", element="0.7352996272394383-3")>, 
 <selenium.webdriver.remote.webelement.WebElement 
 (session="7978296e5858040f56f27f3414087c60", element="0.7352996272394383-4")> 

So when I try to select the option by visible text, for example 'Caraibi' I get the following error:

# select by visible text
select.select_by_visible_text('Caraibi') 


OUT: ElementNotVisibleException: element not visible: Element is nocurrently 
visible and may not be manipulated(Session info: chrome=63.0.3239.132)
(Driver info: chromedriver=2.33.506120 
(e3e53437346286c0bc2d2dc9aa4915ba81d9023f),platform=Windows NT 6.1.7601 SP1 
x86_64)

Thanks for your help!!!


回答1:


You can simply try click on the select element, then click on required option. It may help you.

 from selenium import webdriver
 from selenium.webdriver.support.ui import Select
 import time

 driver = webdriver.Chrome('path/to/the/driver.exe')
 driver.get('https://www.costacrociere.it/B2C/I/Pages/Default.aspx')
 driver.set_window_size(800, 660)
 time.sleep(2)
 select=driver.find_element_by_id("ctl00_ctl00_ctl00_ctl37_g_7e88f2a7_c220_4ba6_8ca8_49ca1297d22a_cruiseFinderControl_ddl_MacroArea")
select.click()
optionCaraibi=driver.find_element_by_xpath("//select[@id='ctl00_ctl00_ctl00_ctl37_g_7e88f2a7_c220_4ba6_8ca8_49ca1297d22a_cruiseFinderControl_ddl_MacroArea']/option[.='Caraibi']")
optionCaraibi.click()

Change the id of the above code if it is dynamic.




回答2:


The error says it all :

OUT: ElementNotVisibleException: element not visible: Element is nocurrently visible and may not be manipulated(Session info: crome=63.0.3239.132)

The error clearly indicates that the element with which you are trying to interact is not visible as they are dynamic. So we have to induce Explicit Wait for the element_to_be_visible as follows :

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

driver = webdriver.Chrome()
driver.get('https://www.costacrociere.it/B2C/I/Pages/Default.aspx')
driver.maximize_window()
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='selectric-wrapper selectric-ddlMacroArea']"))).click()
WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='selectric-items']//ul//li[text()='Caraibi']"))).click()
print("Option Caraibi clicked") 

Console Output :

Option Caraibi clicked


来源:https://stackoverflow.com/questions/48337788/python-selenium-select-element-from-drop-down-element-not-visible-exception

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!