如何在python中使用selenium单击与另一个元素相同的元素?

如何在python中使用selenium单击与另一个元素相同的元素?,python,selenium,modal-dialog,z-index,webdriverwait,Python,Selenium,Modal Dialog,Z Index,Webdriverwait,我想点击一个按钮元素,它与同一页面上的另一个按钮元素相同,但一个在前面,一个在后面(见图)。我该怎么做? 第一个x按钮的html代码如下所示: <div id="ModalPopAmityHostel" class="modal fade in" role="dialog" aria-hidden="false" style="display: block;"> <div class="modal-dialog " style="z-index:1045464

我想点击一个按钮元素,它与同一页面上的另一个按钮元素相同,但一个在前面,一个在后面(见图)。我该怎么做? 第一个x按钮的html代码如下所示:

 <div id="ModalPopAmityHostel" class="modal fade in" role="dialog" aria-hidden="false" style="display: block;">
        <div class="modal-dialog " style="z-index:104546464; ">

            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal">×</button>
                    <h4 class="modal-title">Amity Hostel</h4>
                </div>
它给出了以下错误:

Traceback (most recent call last):
  File "amizone_automated_login.py", line 36, in <module>
    driver.find_element(By.CLASS_NAME, "close").click()
  File "/home/manik/anaconda3/lib/python3.7/site-packages/selenium/webdriver/remote/webelement.py", line 80, in click
    self._execute(Command.CLICK_ELEMENT)
  File "/home/manik/anaconda3/lib/python3.7/site-packages/selenium/webdriver/remote/webelement.py", line 633, in _execute
    return self._parent.execute(command, params)
  File "/home/manik/anaconda3/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/home/manik/anaconda3/lib/python3.7/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable
  (Session info: chrome=79.0.3945.88)
回溯(最近一次呼叫最后一次):
文件“amizone_automated_login.py”,第36行,在
driver.find_元素(By.CLASS_NAME,“close”)。单击()
文件“/home/manik/anaconda3/lib/python3.7/site packages/selenium/webdriver/remote/webelement.py”,第80行,单击
self.\u执行(命令。单击\u元素)
文件“/home/manik/anaconda3/lib/python3.7/site packages/selenium/webdriver/remote/webelement.py”,第633行,在
返回self.\u parent.execute(命令,参数)
文件“/home/manik/anaconda3/lib/python3.7/site packages/selenium/webdriver/remote/webdriver.py”,第321行,在execute中
self.error\u handler.check\u响应(响应)
文件“/home/manik/anaconda3/lib/python3.7/site packages/selenium/webdriver/remote/errorhandler.py”,第242行,在check_响应中
引发异常类(消息、屏幕、堆栈跟踪)
selenium.common.exceptions.ElementNotInteractiableException:消息:元素不可交互
(会话信息:chrome=79.0.3945.88)
这是网页:


我认为这个错误是因为它单击了弹出窗口后面的x按钮,因为它是html脚本中的第一个按钮。是否有办法单击前面的x按钮?

而不是通过
classname
直接获取元素,您应该使用xpath中的
id
获取元素,因为这两个窗口的
id
不同。
您可以使用以下命令关闭第一个窗口:

driver.find_element(By.XPATH, "//div[@id='ModalPopAmityHostel']//button[@class='close']").click()
单击第一个关闭按钮后,您可以以类似的方式单击第二个关闭按钮,只需将id替换为
StudentSatisfactionPop

z-index即可 CSS属性指定元素的堆栈顺序。具有较高堆栈顺序的元素始终位于具有较低堆栈顺序的元素的前面。因此,z指数较大的重叠元素覆盖了z指数较小的重叠元素


比较您提供的两个HTML,以下元素具有更大的z索引,因此涵盖了另一个元素

<div id="ModalPopAmityHostel" class="modal fade in" role="dialog" aria-hidden="false" style="display: block;">
    <div class="modal-dialog " style="z-index:104546464; ">
  • 使用
    XPATH

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@id='ModalPopAmityHostel']//div[@class='modal-content']/div[@class='modal-header']/button[@class='close' and @data-dismiss='modal']"))).click()
    
  • 注意:您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
  • WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div#ModalPopAmityHostel div.modal-content>div.modal-header>button.close[data-dismiss='modal']"))).click()
    
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@id='ModalPopAmityHostel']//div[@class='modal-content']/div[@class='modal-header']/button[@class='close' and @data-dismiss='modal']"))).click()
    
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC