如何在下拉列表中选择要滚动的项目?

2024-09-30 20:28:07 发布

您现在位置:Python中文网/ 问答频道 /正文

在以下网站:https://www1.hkexnews.hk/search/titlesearch.xhtml?lang=en

我正试图通过selenium选择以下下拉列表选项: 在Headline category and Document Type下,在第一个下拉列表中选择Headline Category,然后在第二个列表中选择Announcements and Notices -> New Listings (Listed Issuers/New Applicants -> Allotment Results。你知道吗

我已经意识到你必须使用driver.find_element_by_css_selector(),因为列表上的项目都没有唯一的ID。 我还意识到,当选项不在视图中时,您必须滚动页面,以便CSS选择器可以选择它。你知道吗

我所拥有的东西应该有用,但它没有?有人能帮我解决这个问题吗?你知道吗

```python

# Select dropdown list
driver.find_element_by_css_selector('#rbAfter2006 > div > div > div').click()
# Select Announcements and Notices
driver.find_element_by_css_selector('#rbAfter2006 > div ~ div > div > div > div > ul > li ~ li ').click()

# Scroll down so that New Listings (Listed Issuers/New Applicants) is in view
element = driver.find_element_by_css_selector('#rbAfter2006 > div ~ div > div > div > div > ul > li ~ li > a '
                                    '~ div > div > ul > li ~ li ~ li ~ li ~ li ~ li ~ li  ~ li ~ li')

actions = ActionChains(driver)
actions.move_to_element(element).perform()

# Click New Listings (Listed Issuers/New Applicants)
driver.find_element_by_css_selector('#rbAfter2006 > div ~ div > div > div > div > ul > li ~ li > a '
                                    '~ div > div > ul > li ~ li ~ li ~ li ~ li ~ li ~ li ').click()


# THIS IS WHAT FAILS, Can't find element? I am currently printing the box so I know what is selected
print(driver.find_element_by_css_selector('#rbAfter2006 > div ~ div > div > div > div > ul > li ~ li > a '
                                    '~ div > div > ul > li ~ li ~ li ~ li ~ li ~ li ~ li > a ~ div > ul > li ~ li').text)

```

我当前得到一个元素找不到一个错误


Tags: anddiv列表newbydriverlielement
3条回答

你能试着用css选择器从下拉列表中得到一个值吗

ul li a

然后循环查找匹配的值并单击它

理想情况下,我们不应该选择这样复杂的css选择器元素,尽量缩短css选择器。你知道吗

那么

尝试将鼠标悬停到下拉列表中的第一个元素,如下所示:

driver.action.move_to(first_element_in_dropdown).perform

那么

尝试滚动到需要使用的元素

driver.execute_script("arguments[0].scrollIntoView({behavior: 'smooth', block: 'center', inline: 'nearest'});",element_to_be_selected)

注意:代码是Ruby的,请尝试翻译成python并使用。这也许会有帮助

要从下拉列表中单击项,请使用WebDriverWaitpresence_of_element_located(),然后使用location_once_scrolled_into_view并使用以下xpath单击元素。你知道吗

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

driver = webdriver.Chrome()
driver.get('https://www1.hkexnews.hk/search/titlesearch.xhtml?lang=en')
driver.maximize_window()
wait = WebDriverWait(driver,40)
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'div.combobox-input-wrap a[data-value="rbAll"]'))).click()
wait.until(EC.element_to_be_clickable((By.XPATH,'//div[@class="droplist-item"]/a[contains(.,"Headline Category")]'))).click()
wait.until(EC.element_to_be_clickable((By.XPATH,'//div[@id="rbAfter2006"]//div[@class="combobox-input-wrap"]/a[contains(.,"ALL")]'))).click()
wait.until(EC.element_to_be_clickable((By.XPATH,'//div[@class="droplist-group"]//ul[@class="droplist-items"]//li/a[contains(.,"Announcements and Notices")]'))).click()
ele=wait.until(EC.presence_of_element_located((By.XPATH,'//div[@class="droplist-group droplist-submenu level2"]//ul//li/a[contains(.,"New Listings (Listed Issuers/New Applicants)")]')))
ele.location_once_scrolled_into_view
ele.click()
ele2=wait.until(EC.presence_of_element_located((By.XPATH,'//div[@class="droplist-group droplist-submenu level3"]//ul//li/a[contains(.,"Allotment Results")]')))
ele2.location_once_scrolled_into_view
ele2.click()

浏览器快照

enter image description here

相关问题 更多 >