首页 > 解决方案 > 运行所有代码时无法在框架内找到元素

问题描述

我想在某个页面上找到弹出窗口的元素,

弹出 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中的内容甚至都看不到。

iframe 不可扩展

当 iframe 可扩展时


7/26 更新

我想知道我是否问了正确的问题,这可能会导致你们只关注我的代码部分。由于我的代码(单独)有效,因此元素和框架的方法很好。

我退后一步,找到一个可能有帮助的细节,但我不知道它有多重要。

下面是关于页面源码中某些元素的 ctrl-F 的两张截图:

正常结果:找到并突出显示目标

奇怪的结果:找到目标并且没有突出显示

我的意思是当页面存在“奇怪的结果”时,我的代码不起作用。

PS。该页面是电子商务网站的订单确认部分,但该网站将其商品分为两种类型,从而导致两种类型的订单页面。

标签: pythonhtmlselenium

解决方案


对于 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()

推荐阅读