框阻止元素出现问题

时间:2019-10-15 14:33:05

标签: selenium

我试图单击前面有一个对话框的“组”按钮。首先,我通过单击“确定”关闭对话框,将其关闭,但是硒表示有时找不到“组”按钮,因为有东西在阻止它。有时它将运行正常,我不知道是什么原因导致此问题偶尔发生。

这是我的代码:

upload_ok = WebDriverWait(driver, 10).until(
            EC.element_to_be_clickable((By.XPATH, "//button[@class='dialogButton primary']")))
upload_ok.click()
groupstab = WebDriverWait(driver, 10).until(
            EC.element_to_be_clickable((By.XPATH, "//button[contains(text(),'Groups')]")))
groupstab.click()

这是HTML:

<iframe id="tab_Admin" name="frame_Admin" data-bind="iframeSrc: link, attr: { id: 'tab_' + id + (index() || ''), name: 'frame_' + id + (index() || ''), class: ($parent.headless() === true ? 'headless ': '')  + (rightSliderUrl ? 'right-slider-space ' : '') + 'iframe-content' + ($parent.selectedTab() &amp;&amp; $parent.selectedTab().id === id &amp;&amp; $parent.selectedTab().index() === index() ? '' : ' iframe-content-unselected') }" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen="" src="/prism/admin?embed=ba1&amp;openTab=monitor" class="iframe-content">
    #document
        <!DOCTYPE html>

        <head></head>
    <body role="application" "="">
       <div class="main-content" id="mainContent">
        <div class="pageView adminView" style="">
            <div class="tabs>
                <button tab="0" class="selected">Users</button>
                <button tab="1">Groups</button>
                <button tab="2">Lifecycle Management</button>
                <button tab="3">Features</button>
                <button tab="4" class="">Databases</button>
            </div>
        </div>
      </div>

    <div id="modalDialog_11" class="dialogBlocker show" style="height: 606px;">
            <div id="modalDialog_11Container" class="dialogBlockerCell adminDialog">
                <div class="modalDialog" tabindex="0" role="dialog">
                    <div class="dialogContent">
                        <h1>Success!</h1>
                        <div class="msg">
                            Your file 'users.csv' has been successfuly uploaded.<br>
                            </div>
                            <br>
                            </div>
                        <footer style="margin-right: 20px;">
                            <button class="dialogButton primary" aria-label="OK" role="button" tabindex="1">OK
                            </button>
                        </footer>
                     </div>
                </div>
          </div>
    </body>
</iframe>

我不知道是否与元素class =“ dialogBlocker show”有关,这使得页面的其余部分在框的后面变为灰色。 这是它的屏幕截图:

Box

有人知道吗? 谢谢。

1 个答案:

答案 0 :(得分:2)

基于您提供的HTML,这看起来像是模式而不是警报。您只需使用模式,就好像它是普通的HTML元素一样。您可能必须在模式关闭时添加一个wait,以便在完全隐藏模式之前找不到Groups

我带了您的示例代码,并添加了一行附加内容,以等待invisibility_of进入模式对话框:

# wait to click OK
upload_ok = WebDriverWait(driver, 10).until(
            EC.element_to_be_clickable((By.XPATH, "//button[@class='dialogButton primary']")))

# click OK
upload_ok.click()

# wait on modal to disappear
WebDriverWait(driver, 10).until(
            EC.invisibility_of_element_located((By.XPATH, "//div[contains(@class, 'dialogBlocker')]")))

# wait on groups tab
groupstab = WebDriverWait(driver, 10).until(
            EC.element_to_be_clickable((By.XPATH, "//button[contains(text(),'Groups')]")))

# click groups tab
groupstab.click()

wait上的groupstab几乎总是会成功,因为该元素位于模式下方,并且仍位于DOM上。因此,如果模态在单击之前没有完全消失,那么您会收到ClickIntercepted错误是有道理的。

另一种选择是尝试点击groupstab而不是groupstab.click()来使用Javascript:

driver.execute_script("arguments[0].click();", groupstab)