【问题标题】:How to click the close button within a modal window through Selenium and Python如何通过 Selenium 和 Python 在模态窗口中单击关闭按钮
【发布时间】:2019-03-01 06:39:55
【问题描述】:

无法在模态窗口中单击按钮id="close

尝试所有 xpath,例如:

//button[@data-dismiss='modal']
//button[@id='close'], //button[@type='button']
//button[contains(.,'Закрыть')]
//button[contains(@data-dismiss,'modal')]
//button[contains(@id,'close')]

也尝试合并 xpath,但仍然无法正常工作

代码:

<div id="idCardGroupChangeStatusResult" class="modal fade in" tabindex="-1" role="dialog" aria-hidden="false" style="display: block;">
<div class="modal-dialog st-modal-dialog" style="width: 600px; padding-top: 250px;">
<div class="modal-content">
<div class="modal-header st-pad-normal">
<div class="modal-body">
<div class="modal-footer">
<button id="close" class="btn btn-default btn-sm" type="button" data-dismiss="modal"> Закрыть </button>
</div>
</div>
</div>
</div>

Css 不工作

有什么想法吗?

【问题讨论】:

标签: python selenium xpath css-selectors webdriverwait


【解决方案1】:

由于文本为 Закрыть 的元素在 Modal Dialog Box 内,因此要找到所需的元素,您必须诱导 WebDriverWait 以使 元素可点击 您可以使用以下任一解决方案:

  • 使用CSS_SELECTOR

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button.btn.btn-default.btn-sm#close[data-dismiss='modal']"))).click()
    
  • 使用XPATH

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[@class='btn btn-default btn-sm' and @id='close'][@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
    

【讨论】:

  • 谢谢回答!尝试这种方式,超时异常。也尝试这个 - el = self.xpath('//*[@aria-hidden="false"]') el2 = el.xpath('//div[@class="modal-dialog st-modal-dialog "]') el3 = el2.xpath('//div[@class="modal-footer"]') el4 = el3.xpath("//button[@id='close']") el4.click( ) 这种“循序渐进”的方式也行不通
  • 你从哪里得到所有这些el.xpath('//div[@class="modal-dialog st-modal-dialog"]') 和`el3.xpath("//button[@id='close']")`?你能复制、粘贴并执行这行代码并更新我的状态吗?
  • 使用 Xpath:..\..\..\venv1\lib\site-packages\selenium\webdriver\support\wait.py:80: TimeoutException。与 css 相同
【解决方案2】:

如果element_to_be_clickable 不起作用,请尝试下面的代码来检查页面上是否有多个关闭按钮。您可以使用下面的代码按可见或可见和最新的进行过滤,然后单击它。

close_buttons = WebDriverWait(driver, 5).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#idCardGroupChangeStatusResult #close")))
# check how many buttons in on the HTML, you can try "visibility_of_all_elements_located"
print(len(close_buttons))

visible_buttons = [close_button for close_button in close_buttons if close_button.is_displayed()]
visible_buttons_len = len(visible_buttons)
print(visible_buttons_len)

visible_buttons[visible_buttons_len - 1].click()

消息会消失吗?

更新,消息窗口消失:

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
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome()
wait = WebDriverWait(driver, 5)
actions = ActionChains(driver)

#...

status_message = wait.until(
    EC.visibility_of_element_located((By.CSS_SELECTOR, "#idCardGroupChangeStatusResult")))

actions.move_to_element(status_message).perform()
# here you can get text from message window, check/assert ..
status_message.find_element_by_css_selector("#close").click()

【讨论】:

  • 谢谢你的回答!它消失了,然后我逐步在调试模式下运行我的测试,但是如果我运行它返回 - E IndexError: list index out of range
  • @Odiosuu share print(len(closeButtons)) 控制台打印结果
  • @Odiosuu 当您手动将鼠标悬停在消息窗口上时,它会消失还是一直停留直到您取消悬停?
  • 停留直到我悬停它
  • 仍然得到 selenium.common.exceptions.TimeoutException:消息:..\..\..\venv1\lib\site-packages\selenium\webdriver\support\wait.py:80: TimeoutException .你尝试使用 time.sleep(5) 但它没有帮助。在我得到那个模态窗口之前测试失败
猜你喜欢
  • 2022-07-25
  • 2020-06-29
  • 2014-07-21
  • 2021-12-31
  • 1970-01-01
  • 2018-03-01
  • 1970-01-01
  • 2021-04-18
  • 1970-01-01
相关资源
最近更新 更多