硒的新手!我正在尝试使用硒在Craigslist上列出待售房屋。
我无法从下拉选择框中选择一个选项。
from selenium import webdriver
driver = webdriver.Chrome(executable_path=r'D:/apps/chromedriver/chromedriver.exe')
driver.get('https://post.craigslist.org/k/tKNKfCkr6hG7ghq71YXqTA/oj7w8?s=edit')
driver.find_element_by_css_selector("select.housing_type > option[value='6']").click()
我收到以下错误:
ElementNotInteractableException:消息:元素不可交互: 元素当前不可见,可能无法操作
使用“选择”也会产生相同的错误:
from selenium.webdriver.support.ui import Select
housing_type = Select(driver.find_element_by_css_selector("select.housing_type"))
housing_type.select_by_visible_text('house')
该元素存在:
housing_type = driver.find_element_by_css_selector("select.housing_type")
housing_type
但这不是很棘手:
housing_type.click()
ElementNotInteractableException:消息:元素不可交互
我注意到select元素被隐藏,并且选择由select框上的下一个元素控制。
<label class="json-form-item select housing_type std variant-select">
<div class="label-wrapper"><span class="label">housing type</span></div>
<select tabindex="1" name="housing_type" class="json-form-input no-js housing_type" id="ui-id-1" style="display: none;">
<option value="1" selected="">apartment</option>
<option value="2">condo</option>
<option value="3">cottage/cabin</option>
<option value="4">duplex</option>
<option value="5">flat</option>
<option value="6">house</option>
<option value="7">in-law</option>
<option value="8">loft</option>
<option value="9">townhouse</option>
<option value="10">manufactured</option>
<option value="11">assisted living</option>
<option value="12">land</option>
</select>
<span class="ui-selectmenu-button ui-widget ui-state-default ui-corner-all" tabindex="0" id="ui-id-1-button" role="combobox" aria-expanded="false" aria-autocomplete="list" aria-owns="ui-id-1-menu" aria-haspopup="true" style="width: 88%;">
<span class="ui-icon ui-icon-triangle-1-s"></span>
<span class="ui-selectmenu-text">apartment</span>
</span>
</label>
我可以通过激活元素并使用向下/返回键进行选择,如下所示,但这不是一个很好的解决方案。
from selenium.webdriver.common.keys import Keys
housing_type = driver.find_element_by_id("ui-id-1-button")
housing_type.click()
for i in range(0,5):
housing_type.send_keys(Keys.DOWN)
housing_type.send_keys(Keys.RETURN)
有更好的选择方法吗?
答案 0 :(得分:0)
不幸的是,这似乎与重叠/下拉菜单的使用方式有关。
我注意到select元素被隐藏,并且选择由select框上的下一个元素控制。
由于下拉菜单的可见性由某些叠加层控制,因此您将被迫单击下拉菜单按钮以激活叠加层并使下拉按钮可见。在下拉按钮变为可见之后,您应该能够使用Selenium代码,而不会出现其他问题。即,此代码段应该很好用:
housing_type = Select(driver.find_element_by_css_selector("select.housing_type"))
housing_type.select_by_visible_text('house')
我建议使用这种方法,而不是使用Keys.DOWN
操作的替代方法,因为这是对Selenium内置函数的更好使用。
答案 1 :(得分:0)
要从提供的页面上的“住房类型”下拉列表中选择一项,我将首先在下拉菜单上调用WebDriverWait
以确保它存在,然后再尝试与之交互。然后,您可以使用Javascript单击下拉触发器并展开选项。
此后,我们再次在希望单击的选项上调用WebDriverWait
。下面的代码示例将单击选项“ flat”:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# start driver
driver = webdriver.Chrome(executable_path=r'D:/apps/chromedriver/chromedriver.exe')
driver.get('https://post.craigslist.org/k/tKNKfCkr6hG7ghq71YXqTA/oj7w8?s=edit')
# wait for dropdown to exist
WebDriverWait(driver, 15).until(EC.presence_of_element_located((By.XPATH, "//label[contains(@class, 'housing_type')]")))
# expand housing type dropdown using javascript
dropdown_trigger = driver.find_element_by_xpath("//label[contains(@class, 'housing_type')]/span/span[contains(@class, 'ui-icon')]")
driver.execute_script("arguments[0].click();", dropdown_trigger)
# select an option -- this selects 'flat'
dropdown_option = WebDriverWait(driver, 15).until(EC.presence_of_element_located((By.XPATH, "//li[text()='flat']")))
dropdown_option.click()