【发布时间】: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 中的内容。
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 吗?在弹出窗口出现后。