ElementNotVisibleException: Message: element not interactable error while trying to click a button through Selenium and Python

狂风中的少年 提交于 2019-11-26 02:26:32

问题


I have a page with source code like the code below. In it after I take an action an “Undo” and a “Close” button appear. I’m trying to click the “Close” button. I’ve tried all three of the chunks of code below, none are working. Can someone please point out what I’m doing wrong, or suggest something else to try?

html source:

<div class=\"_3Aslx7L3GVI4XM7PUyYKza action-bar\"><div class=\"container\"><i class=\"success-icon fontello-ok-circle\"></i><div class=\"success-message\">Your stuff is going to <span>place</span> is on its way.</div><div class=\"gh69ID1m3_xtdTUQuwadU\"><button class=\"c-button c-button--gray\"> Undo</button></div><div class=\"gh69ID1m3_xtdTUQuwadU\"><button class=\"c-button c-button--blue\"> Close</button></div></div></div>

code attempts:

#driver.find_element_by_id(\"gh69ID1m3_xtdTUQuwadU\").click()
driver.find_element_by_css_selector(\'.c-button.c-button--blue\').click()
#driver.find_element_by_link_text(\'Close\').click()

error:

---------------------------------------------------------------------------
ElementNotVisibleException                Traceback (most recent call last)
<ipython-input-15-6d570be770d7> in <module>()
      1 #driver.find_element_by_id(\"gh69ID1m3_xtdTUQuwadU\").click()
----> 2 driver.find_element_by_css_selector(\'.c-button.c-button--blue\').click()
      3 #driver.find_element_by_link_text(\'Close\').click()

~/anaconda/envs/py36/lib/python3.6/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):

~/anaconda/envs/py36/lib/python3.6/site-packages/selenium/webdriver/remote/webelement.py in _execute(self, command, params)
    626             params = {}
    627         params[\'id\'] = self._id
--> 628         return self._parent.execute(command, params)
    629 
    630     def find_element(self, by=By.ID, value=None):

~/anaconda/envs/py36/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py in execute(self, driver_command, params)
    318         response = self.command_executor.execute(driver_command, params)
    319         if response:
--> 320             self.error_handler.check_response(response)
    321             response[\'value\'] = self._unwrap_value(
    322                 response.get(\'value\', None))

~/anaconda/envs/py36/lib/python3.6/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):

ElementNotVisibleException: Message: element not interactable
  (Session info: chrome=72.0.3626.109)
  (Driver info: chromedriver=2.42.591059 (a3d9684d10d61aa0c45f6723b327283be1ebaad8),platform=Mac OS X 10.12.6 x86_64)

回答1:


The element with text as Close is a dynamic element so to locate the element you have to induce WebDriverWait for the element to be clickable and you can use either of the following solutions:

  • Using CSS_SELECTOR:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.action-bar button.c-button.c-button--blue"))).click()
    
  • Using XPATH:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[contains(@class, 'action-bar')]//button[@class='c-button c-button--blue' and normalize-space()='Close']"))).click()
    
  • Note : You have to add the following imports :

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



回答2:


Try using XPATHs and Action class for this kind of scenarios.

BTN_xpath = //*[contains(@class, 'c-button--blue')]
WebElement btn = driver.find_element_by_xpath(BTN_xpath);
Actions ac = new Actions(driver);
ac.click(btn).build().perform();

Also, if you are using the Firefox browser, there could be issues where its not able to interact with elements that were not visible before in the page. So, try checking a with a different browser as well.



来源:https://stackoverflow.com/questions/54758691/elementnotvisibleexception-message-element-not-interactable-error-while-trying

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