我正试图抓取以下网站link
我需要自动执行以下步骤:
1)选择正确的下拉表(左边的第一个表示下面的图像)。
2)从下拉菜单中选择一个选项(Caraibi选项)。
3)点击搜索按钮。
下拉图片:左边第一个(“Dove vuoi andare?”)。
HTML代码如下:
<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>
我正在使用此代码:
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
所以直到这里我可以得到所有选项(这是他们的一部分):
[<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")>
因此,当我尝试通过可见文本选择选项时,例如'Caraibi',我收到以下错误:
# 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)
感谢您的帮助!!!
答案 0 :(得分:0)
错误说明了一切:
OUT: ElementNotVisibleException: element not visible: Element is nocurrently visible and may not be manipulated(Session info: crome=63.0.3239.132)
错误清楚地表明您尝试互动的元素不可见,因为它们动态。因此,我们必须为 element_to_be_visible 引导Explicit Wait
,如下所示:
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")
控制台输出:
Option Caraibi clicked
答案 1 :(得分:0)
您只需单击选择元素,然后单击所需选项即可。它可能对你有帮助。
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()
如果上述代码是动态的,请更改它的ID。