python-3.x - 如何访问 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;
}
感谢你们对我的帮助!
解决方案
如果没有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()
推荐阅读
- computer-vision - 如何在 pytorch 上保存训练有素的模型的权重?
- go - 我如何用接口重构这段代码,如果是这样,我应该吗?
- c - 当工作区位于 ~/src 而不是 /tmp 时,VS Code 在“stdio.h”下显示红色曲线
- coded-ui-tests - 数据:“无法反序列化 params.x - 绑定:第 47 位缺少必填字段”
- java - 使用 LinkedLists 在 Java 中添加多项式
- python - 获取数组中单选按钮的内容
- javascript - 如何使用 getUserMedia() 选择要激活的相机以进行条码扫描功能?
- python - 关于 Freecodecamp 练习的 Pandas 数据规范化解释?
- ios - 固定单元宽度 - 无法同时满足约束
- wpf - 如何在鼠标位置放大或缩小时正确同步 WPF Scrollviewer 和 Canvas