首页 > 解决方案 > 如何访问 Selenium 中的模态对话框表窗口?

问题描述

我有一个似乎在屏幕上弹出的“窗口”,但我不相信它真的是一个弹出窗口。

这是它在屏幕上的样子: 在此处输入图像描述

在此使用浏览器的inspect功能给了我一个Rel XPath//table[@class='DialogFrameContainer']

当我深入研究此弹出窗口的 CSS 表时,评论中将其描述为Modal Dialog使用表格。

在这个问题的底部有更多的截图和 CSS 代码。

我不知道它到底是什么(所以我可能错了,它是一个弹出窗口),但我想点击它上面的“是”按钮,但不知道怎么做。

我尝试使用以下用于处理弹出警报的模式,但它不起作用。它打印no alert然后程序崩溃 b/cdriver仍然卡在同一个窗口上:

        try:
            WebDriverWait(driver, 3).until(EC.alert_is_present(),
                                           'Timed out waiting for PA creation ' +
                                           'confirmation popup to appear.')
            alert = driver.switch_to.alert
            print("alert accepted")
        except:
            print("no alert")
            continue

我也尝试过这种模式来尝试获取title窗口的 ,但它只给了title我开始的单个主页的 ,意思selenium是只识别一个页面:

    handles = driver.window_handles
    size = len(handles)

    for x in range(size):
      driver.switch_to.window(handles[x])
      print(driver.title)

我也尝试了这个解决方案,它不起作用 b/c 只有一个窗口。

弹出窗口Rel XPath是:

//table[@class='DialogFrameContainer']

并且其中的“是”按钮每次会话都会更改其命名空间,因此我正在寻找一种解决方案,该解决方案单击以 . 开头的按钮btnYes_Namespace。以下是以下屏幕截图中会话的实际按钮相对 XPath 的文本:

//span[@id='btnYes_Namespace_58f12742_b57c_48d7_b0a6_6e3604bc50e1_Label']

问题更新:

根据@JeffC 的回答,我尝试了以下方法:

driver.find_element_by_xpath("//a[./span[.='Yes']]").click()

哪个不起作用,并且由于按钮名称以开头btnYes_Namespace但随后包含一个字符串,该字符串会更改每个会话,因此我改编了他的代码并尝试了以下操作:

            try:
                found_buttons = driver.find_elements_by_xpath("//*[starts-with(@id, 'btn')]")
                for button in found_buttons:
                    print(button.text)
            except:
                print('Something went wrong')

它打印出主页上所有按钮的名称,但不是这个“弹出”页面,也没有包含其中文本Yes的按钮。

为了更进一步,我尝试了以下代码:

            try:
                yes_buttons = driver.find_elements_by_xpath("//*[contains(text(), 'Yes')]")
                for yes in yes_buttons:
                    print(yes.text)
            except:
                print('Something did not work right.')

并且没有打印出来。

在处理这个问题时,我发现这个 CSS 代码可能会有所帮助:

/* Modal Dialogs */
/* TODO: delete this declaration when modal dialog frames no longer use tables */
table.DialogFrameContainer, table.DialogContentContainer, .DialogFrameHeader table
{
  width: 100%;

  /* not structurally necessary at all but this helps us separate our inset and outset borders for a certain effect */
  border-collapse: separate;
  border-spacing: 0px;
  background-color: transparent;
}
.DialogFrameContainer
{
}
table.DialogFrameContainer
{
  background-color: #eee;
  border: outset 2px #eee;
}
.DialogFrameHeader
{
  cursor: move;
  width: 100%;
  background-color: #000080;
  color: #fff;
}
.DialogFrameHeader table
{
  border-bottom: solid 1px #eee;
}
.DialogFrameHeader td
{
  padding: 2px;
  text-align: left;
}
td.DialogFrameHeaderTitleCell
{
  padding-left: 5px;
}
.DialogFrameHeaderTitleCell span
{
  color: #fff;
  font-weight: bold;
}
.DialogFrameHeaderCloseCell
{
}
.DialogFrameHeaderCloseIcon
{
  cursor: pointer;
  background: transparent url('Images/window_close_x.gif') no-repeat center;
  width: 16px;
  height: 16px;
  float: right;
  border: outset 2px #eee;
}
.DialogContentContainer
{
}
.DialogContent
{
  overflow: auto;
  text-align: center;
}
table.DialogContentContainer
{
  border: inset 1px #eee;
}

感谢你们对我的帮助!

标签: python-3.xseleniumselenium-webdriver

解决方案


如果没有iframe,可以使用这种方式:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service

s = Service('C:/Users/.../chromedriver.exe')
driver = webdriver.Chrome(service=s)

# Open first dialog such as login!
log_in_f = driver.find_element(By.CSS_SELECTOR, 'div.H\(40px\).Px\(28px\)')
log_in_f.click()

time.sleep(5)
# open second dialog such as log in by phone 
phone_path='div:nth-child(4) > span > div:nth-child(3) > button'
log_in_s = driver.find_element(By.CSS_SELECTOR, phone_path)
log_in_s.click()

time.sleep(5)
# Open third dialog such as to verify 
close_path=' div > div.Pos\(a\).T\(0\).P\(20px\).P\(12px\)--xs.End\(0\).D\(b\) > button'
log_in_t = driver.find_element(By.CSS_SELECTOR, close_path)
log_in_t.click()

推荐阅读