简体   繁体   English

无法使用硒单击按钮

[英]Cannot Click the button by using selenium

I try to click the hidden button by scrolling to the element but still not working. 我尝试通过滚动到元素来单击隐藏按钮,但仍然无法正常工作。 Only if i scroll it manually, the coding is working. 仅当我手动滚动它时,编码才起作用。 May I know the reasons? 我可以知道原因吗? Thank you! 谢谢! website: https://www1.hkexnews.hk/search/titlesearch.xhtml?lang=en 网址: https : //www1.hkexnews.hk/search/titlesearch.xhtml?lang=zh-CN

options = webdriver.ChromeOptions()
options.add_argument("--no-sandbox")
driver = webdriver.Chrome("C:/Users/Ivan.Chak/Desktop/cbbc/chromedriver", chrome_options=options)
driver.implicitly_wait(30)
driver.get("https://www1.hkexnews.hk/search/titlesearch.xhtml?lang=en")
driver.find_element_by_css_selector("#tier1-select .combobox-input-wrap").click()
driver.find_element_by_css_selector(".searchType .droplist-item:nth-child(2) > a").click()
driver.find_element_by_css_selector("#rbAfter2006 .combobox-field").click()
element = driver.find_element_by_xpath("//a[contains(text(),'Debt and Structured Products')]")
actions = ActionChains(driver)
actions.move_to_element(element).perform()
time.sleep(1)
element.click()  <--- This is not working!!!
---------------------------------------------------------------------------
ElementNotInteractableException           Traceback (most recent call last)
<ipython-input-323-cf25f85114ab> in <module>()
----> 1 element.click()

C:\ProgramData\Anaconda3\lib\site-packages\selenium\webdriver\remote\webelement.py in click(self)
     78     def click(self):
     79         """Clicks the element."""
---> 80         self._execute(Command.CLICK_ELEMENT)
     81 
     82     def submit(self):

C:\ProgramData\Anaconda3\lib\site-packages\selenium\webdriver\remote\webelement.py in _execute(self, command, params)
    631             params = {}
    632         params['id'] = self._id
--> 633         return self._parent.execute(command, params)
    634 
    635     def find_element(self, by=By.ID, value=None):

C:\ProgramData\Anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py in execute(self, driver_command, params)
    319         response = self.command_executor.execute(driver_command, params)
    320         if response:
--> 321             self.error_handler.check_response(response)
    322             response['value'] = self._unwrap_value(
    323                 response.get('value', None))

C:\ProgramData\Anaconda3\lib\site-packages\selenium\webdriver\remote\errorhandler.py in check_response(self, response)
    240                 alert_text = value['alert'].get('text')
    241             raise exception_class(message, screen, stacktrace, alert_text)
--> 242         raise exception_class(message, screen, stacktrace)
    243 
    244     def _value_or_default(self, obj, key, default):

ElementNotInteractableException: Message: element not interactable
  (Session info: chrome=75.0.3770.142)

It might be possible you are scrolling to the element(button) . 您可能会滚动到element(button)。 Which again is getting hidden if your webpage have any kind of ribbon. 如果您的网页具有任何功能区,那么这又将被隐藏。 Try scrolling to any other element above it. 尝试滚动到其上方的任何其他元素。 This had solved my problem. 这解决了我的问题。

You have to scroll to the each menu item before click, for that you can use JavaScript arguments[0].scrollIntoView(true); 单击之前,必须滚动到每个菜单项,因为可以使用JavaScript arguments[0].scrollIntoView(true);

You can use general method to scroll before click like in code below: 您可以使用常规方法进行滚动,然后再单击下面的代码,例如:

def click(element):
    driver.execute_script("arguments[0].scrollIntoView(true);", element)
    element.click()


driver = webdriver.Chrome()
driver.get("https://www1.hkexnews.hk/search/titlesearch.xhtml?lang=en")

driver.find_element_by_css_selector(".searchType").click()
driver.find_element_by_xpath("//div[@class='droplist-item' and ./a[.='Headline Category']]").click()
driver.find_element_by_id("rbAfter2006").click()

click(driver.find_element_by_xpath("//a[.='Debt and Structured Products']"))
click(driver.find_element_by_xpath("//a[.='Debt Securities']"))
click(driver.find_element_by_xpath("//a[.='Issuer-Specific Report - Debt Securities']"))

Or you can use specific method for menu selection like below: 或者,您可以使用如下所示的菜单选择特定方法:

def select_menu(menu_text):
    element = driver.find_element_by_xpath(f"//a[.='{menu_text}']")
    driver.execute_script("arguments[0].scrollIntoView(true);", element)
    element.click()


driver = webdriver.Chrome()
driver.get("https://www1.hkexnews.hk/search/titlesearch.xhtml?lang=en")

driver.find_element_by_css_selector(".searchType").click()
driver.find_element_by_xpath("//div[@class='droplist-item' and ./a[.='Headline Category']]").click()
driver.find_element_by_id("rbAfter2006").click()

select_menu("Debt and Structured Products")
select_menu("Debt Securities")
select_menu("Issuer-Specific Report - Debt Securities")

More generic method to select search criterias: 选择搜索条件的更通用的方法:

def select_search_criteria(criteria, *menus):
    driver.find_element_by_css_selector(".searchType").click()
    criteria_element = driver.find_element_by_xpath(f"//div[@class='droplist-item' and ./a[.='{criteria}']]")
    data_value = criteria_element.get_attribute("data-value")
    criteria_element.click()

    document_type_element = driver.find_element_by_id(data_value)
    if document_type_element.find_element_by_css_selector("a.combobox-field").get_attribute("aria-expanded") == "false":
        document_type_element.click()

    for menu in menus:
        element = document_type_element.find_element_by_xpath(f".//a[.='{menu}']")
        driver.execute_script("arguments[0].scrollIntoView(true);", element)
        element.click()


driver = webdriver.Chrome()
driver.get("https://www1.hkexnews.hk/search/titlesearch.xhtml?lang=en")

select_search_type("Headline Category", "Debt and Structured Products", "Debt Securities")
select_search_type("Document Type", "Circulars")

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM