【问题标题】:Can not locate element inside the frame WHEN running all code运行所有代码时无法在框架内找到元素
【发布时间】:2019-07-26 10:44:18
【问题描述】:

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

弹出的 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 not extendable

when iframe extendable


7/26 更新

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

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

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

Normal result: target found and highlighted

Weird result: target found and no highlight

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

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

【问题讨论】:

  • 您可能希望使用显式等待来等待您正在与之交互的元素加载到 iframe 上。
  • @PRERNAPAL 我认为我的 'ec_visible' 功能正在完成这项工作?
  • 你有超时异常吗?请粘贴您面临的异常。我想,您的框架可能需要超过 5 秒的时间才能定位。
  • @PRERNAPAL 我添加了异常,将等待时间更改为 30 秒并没有帮助,我想这与它无关。
  • 您可以在此处粘贴 HTML 吗?在弹出窗口出现后。

标签: python html selenium


【解决方案1】:

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

【讨论】:

  • 试过但没有运气,我认为我的 'ec_visible' 在这种情况下也能完成同样的工作,因为 iframe 也是一种元素?
  • 您需要确保 iframe 可用,然后切换到它现在 visibility_of_element_located 返回元素,而 iframe 不是常规元素...
  • @spiderhami frame_to_be_available_and_switch_to_it 的返回是 bool 不是一个元素。
  • 我确实用你的替换了我的,它返回了 True。代码的每一部分都是正确的(元素都是可用的),但是将它们一起运行会使目标“不可用”。
  • @spiderhami 我编辑了答案...查看 class_name 的变化span.cndzk-entrance-division-header-click
猜你喜欢
  • 2018-08-01
  • 1970-01-01
  • 2017-02-23
  • 2012-09-07
  • 2016-07-29
  • 1970-01-01
  • 2017-07-27
  • 2014-10-18
  • 1970-01-01
相关资源
最近更新 更多