【问题标题】:Selenium: Cant select/click button in modal. Modal appears after try:exceptSelenium:无法在模态中选择/单击按钮。尝试后出现模态:except
【发布时间】:2021-11-12 01:52:54
【问题描述】:

我遇到了无法在模式中选择按钮的问题。模态仅在运行我的 selenium 脚本时出现,在手动遍历网页时不出现。有趣的是,当我的脚本运行 try/except 时,模态始终会出现,如下所示,但程序进入下一步并且无法让元素单击。在此 try:except 之后尝试获取元素也失败了。否则模式不会显示。

try:
    element=driver.find_element_by_xpath('//div[contains(@href,"appointment")]')
    element.click()
    print("Looking for the modal button")
except NoSuchElementException:
    print("*****Did not find the modal button")

我尝试了以下方法但没有成功:

  1. WebDriverWait(driver, 300).until(EC.element_to_be_clickable((By.XPATH, "//button[@class='btn btn-default btn-ok'][@data-dismiss='modal']"))).click() 这只是超时。

  2. 获取元素的不同方法:

    element = driver.find_element_by_class_name("btn.btn-default.bt-ok")
    

    element=driver.find_element_by_xpath('//div[contains(@href,"appointment")]')
    

在这两种情况下都找不到元素。

  1. 尝试使用 cookie 运行,结果是一样的。
  2. 尝试了各种睡眠定时器,但在此睡眠期间没有出现模式

这是本节的 HTML 片段。不确定

<div class="schedule-modal modal fade in" tabindex="-1" role="dialog" aria-hidden="false" style="display: block;">
            <div class="modal-dialog" role="document">
                <div class="modal-content">
                    <div class="modal-body">

                        <p><strong> Text
                        </p>
                    </div>
                    <div class="modal-footer">
                        <a class="btn btn-default btn-ok" href="/appointment">Start Appointment</a>
                    </div>
                </div>
            </div>
        </div>

提前感谢您的帮助!


更新

看起来上面的代码存在 HTML 代码在模式弹出之前存在于源页面上,这就是我无法访问该元素的原因。我的下一个问题是这个调度模式函数在做什么:

    function showNotice(dom) {
        var $scheduleModal = $(".schedule-modal");
        if ($scheduleModal.length) {
            var link = $(dom).attr('href');
            $scheduleModal.find('.btn-ok').attr('href', link);
            $scheduleModal.modal('toggle');
            return false;
        }

【问题讨论】:

    标签: python selenium xpath modal-dialog webdriverwait


    【解决方案1】:

    您似乎正在尝试查找具有包含appointmenthref 属性的div 元素。您将要选择 a 元素,它是实际包含您要选择的引用的元素。你有两个选择:

    driver.find_element_by_xpath('//a[contains(@href,"appointment")]')

    driver.find_element_by_xpath('//div/a[contains(@href,"appointment")]')

    两者都将获得相同的结果。但您可能需要优化选择,以防万一有多个 a 标记具有 href 属性并包含 appointment

    【讨论】:

    • 谢谢!!我确实尝试过 driver.find_element_by_xpath('//a[contains(@href,"appointment")]'),但会再次尝试您的建议。我在这里猜测,但强烈怀疑它与模态出现的时间有关。在我运行 try:catch 之前,Modal 不会出现。它不是基于计时器的,所以我怀疑模式出现时有一些逻辑。
    【解决方案2】:

    如果您不确定模态元素是否会出现,您可以在try-catch{} 块内将模态按钮的单击包含在为element_to_be_clickable() 引入WebDriverWait 并捕获TimeoutException您可以使用以下Locator Strategy

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.common.exceptions import TimeoutException
    
    try:
        WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//*[contains(., 'login or register')]"))).click()
        print("Modal button clicked")
    except TimeoutException:
        print("Modal button was not found")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-31
      • 2019-04-26
      • 1970-01-01
      • 2021-10-28
      • 1970-01-01
      • 1970-01-01
      • 2017-10-04
      • 2021-10-14
      相关资源
      最近更新 更多