python - 运行所有代码时无法在框架内找到元素
问题描述
我想在某个页面上找到弹出窗口的元素,
弹出 html 写在 iframe 中,
单击主页上的链接也会触发弹出窗口。
奇怪的是,如果我运行整个代码,我找不到“目标”元素:
dr = webdriver.Chrome('chromedriver.exe', options=chrome_options)
modify = (By.CLASS_NAME, "modify")
ec_visible(dr, modify).click()
popup = (By.CLASS_NAME, "add-addr-iframe")
dr.switch_to.frame(ec_visible(dr, popup))
target = (By.CLASS_NAME, "cndzk-entrance-division-header-click")
ec_visible(dr, target).click()
def ec_visible(driver, locator):
return WebDriverWait(driver, 5).until(EC.visibility_of_element_located(locator))
但是,如果我先打开弹出窗口然后定位,它就可以工作。
第一的:
modify = (By.CLASS_NAME, "modify")
ec_visible(dr, modify).click()
#popup = (By.CLASS_NAME, "add-addr-iframe")
#dr.switch_to.frame(ec_visible(dr, popup))
#target = (By.CLASS_NAME, "cndzk-entrance-division-header-click")
#ec_visible(dr, target).click()
然后:(如果我手动打开弹出窗口并运行此代码也可以)
#modify = (By.CLASS_NAME, "modify")
#ec_visible(dr, modify).click()
popup = (By.CLASS_NAME, "add-addr-iframe")
dr.switch_to.frame(ec_visible(dr, popup))
target = (By.CLASS_NAME, "cndzk-entrance-division-header-click")
ec_visible(dr, target).click()
感谢您能指出我的问题!
这是 shell 的例外情况:
引发 TimeoutException(消息,屏幕,堆栈跟踪) selenium.common.exceptions.TimeoutException:消息:
这是html截图,有时iframe中的内容甚至都看不到。
7/26 更新
我想知道我是否问了正确的问题,这可能会导致你们只关注我的代码部分。由于我的代码(单独)有效,因此元素和框架的方法很好。
我退后一步,找到一个可能有帮助的细节,但我不知道它有多重要。
下面是关于页面源码中某些元素的 ctrl-F 的两张截图:
我的意思是当页面存在“奇怪的结果”时,我的代码不起作用。
PS。该页面是电子商务网站的订单确认部分,但该网站将其商品分为两种类型,从而导致两种类型的订单页面。
解决方案
对于 ifarmes,您frame_to_be_available_and_switch_to_it
拥有EC
.
所以试试这个:
WebDriverWait(driver, 5).until(EC.frame_to_be_available_and_switch_to_it((By.CLASS_NAME, "add-addr-iframe")))
target = (By.CLASS_NAME, "span.cndzk-entrance-division-header-click")
ec_visible(dr, target).click()
推荐阅读
- go - 缓冲通道中从未使用过的值会发生什么情况
- c# - ASP.NET Core 2.0+ 中 JwtBearerOptions.SaveToken 属性的用途是什么?
- excel - 如何使用 PowerShell 将可执行的 excel 文件转换为二进制文件(exe 到 xlsb)?
- r - 根据来自另一个数据帧的两个条件过滤一个数据帧
- import - 如何将外部库添加到处理?
- flutter - 如何在 Flutter 中自定义 Slider 小部件?
- multithreading - 参数化测试以在 MSTEST 中运行并行或单线程
- c++ - 有没有更好的方法来检测我的向量中某个项目的多次出现?
- php - 将发送的发票作为最终发票
- go - Go 结构比较 - reflect.DeepEqual 在地图上失败?