python - Selenium:找不到元素
问题描述
我正在尝试切换到框架,但 Selenium 找不到该元素。这是我在定位之前使用 Selenium 获得的 HTML 代码:
<div class="jqmPopOverlay" style="height: 100%; width: 100%; position: fixed; left: 0px; top: 0px; z-index: 2999; opacity: 0.7;"></div><div class="login login-main jqmID1" id="loginForm" style="z-index: 3000; top: 0px; left: 319.5px; display: block;">
<div class="titlebar">
<a class="close" href="#" tabindex="7">✕</a>
</div>
<div class="tooltipstered" id="loginFrame"><iframe frameborder="0" id="easyXDM_default127_provider" name="easyXDM_default127_provider" scrolling="no" style="height: 509.667px;" width="100%"></iframe></div>
</div>
<script async="" defer="" type="text/javascript">undefined</script><script async="" src="//www.googleadservices.com/pagead/conversion_async.js" type="text/javascript"></script><script async="" src="https://www.google-analytics.com/plugins/ua/ec.js" type="text/javascript"></script><script async="" src="https://www.google-analytics.com/analytics.js" type="text/javascript"></script><script async="" src="//www.googletagmanager.com/gtm.js?id=GTM-4DBM"></script><script type="text/javascript">
这是Python代码:
browser = webdriver.Chrome('chromedriver.exe')
browser.get(url)
frame = browser.find_element_by_id("easyXDM_default6255_provider")
browser.switch_to_frame(frame)
这是错误:
NoSuchElementException: Message: no such element: Unable to locate element: {"method":"id","selector":"easyXDM_default6255_provider"}
(Session info: chrome=67.0.3396.99)
(Driver info: chromedriver=2.40.565498 (ea082db3280dd6843ebfb08a625e3eb905c4f5ab),platform=Windows NT 10.0.17134 x86_64)
如您所见,HTML 中有该元素,但无法定位。我究竟做错了什么?
解决方案
尝试这个:
browser = webdriver.Chrome('chromedriver.exe')
browser.get(url)
WebDriverWait(browser, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH, "//*[@id = 'loginFrame']/iframe")))
注意:您必须添加一些导入:
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
首先,您的框架可能具有通用 ID 和名称。这就是为什么我提出了另一个选择器。其次,我添加了WebDriverWait
,它至少等待 10 秒,直到 frame 可用,然后才切换到它。
PS:当您完成 iframe 中的内容后,不要忘记切换到默认内容,如下所示:
browser.switch_to.default_content()
否则你将无法与整个 DOM 交互。
推荐阅读
- flutter - 如何创建这样的渐变进度指示器?
- javascript - 在 Javascript 的网格中显示图像
- css - 如何在 Prime React 中灰显动态菜单
- python - 使用 Sklearn 进行蛮力模型选择
- reactjs - 不变违规:可加载:SSR 需要 `@loadable/babel-plugin`,请安装它可加载组件
- java - 致命异常:java.lang.IllegalArgumentException fd 在仅 Android Q 的 PrintAdapter 类的 onwrite() 中不能为空
- java - 使用 jaxrs 对 java 后端应用程序进行单元测试,使用 jpql 进行 dao,在 glassfish 上运行
- rest - 如何获取自定义属性 AllowedValues 的 objectID 字段以更新/删除它们?
- nim-lang - Nim 中的排序列表应该使用什么类型?
- javascript - 如何通过修复任何潜在不匹配的步骤来增加/减少数字?