如何解决是否可以在selenium-webriver中模拟Firefox-console cd功能和/或javascript-context-switching?
当前的Firefox Web Console(我键入的版本为80.0.1
)支持通过cd
函数将Javascript上下文切换到iframe(尽管set被删除了) ),如
var ifr = document.getElementById('frame_id');
cd(ifr);
可以实现相同的目标
- 如该错误所述,通过从Web控制台右上角的下拉菜单中选择一个不同的Javascript上下文;
- 与Chrome DevTools类似(另请参见older SO exchange)。
问题:
使用selenium-webdriver无头驱动Firefox时是否可以达到相同的效果?
背景:
我有一个页面正在加载一个我无法控制的跨域iframe,并且想访问该iframe下的DOM
个元素。我可以在Web控制台中执行此操作,但是通过Selenium(特别是node
+ selenium-webdriver
程序包)无法做到这一点:
选择相关的iframe,然后使用切换到它
ifr = driver.findElement(By.id('frame_id'));
driver.switchTo().frame(ifr);
使我可以访问与DOM
中看到的内容不同的Web Console
:在Selenium
中,我无权访问浏览器中可用的按钮,表单等。我直接与后者互动。
解决方法
我相信我现在已经掌握了这一点。答案是肯定的:
一个人可以通过cd
访问所有控制台功能(包括Selenium
命令,按钮/菜单等)。
最终使我困惑的是我发布的其他related question上的第一条评论。我将在Firefox
中描述两种解决此问题的方式,并与直接使用浏览器时可以访问(可能是跨域的)iframe的两种方式相匹配:
- 通过控制台cd command或
- 通过下拉frame-context-switching menu
cd command在Selenium with Python
脚本:
from selenium.webdriver import Firefox,DesiredCapabilities,FirefoxProfile
from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
import time
import traceback
options = Options()
webdriver = Firefox(options=options)
webdriver.get(<url-that-embeds-frame>)
try:
time.sleep(3)
with webdriver.context(webdriver.CONTEXT_CHROME):
console = webdriver.find_element(By.ID,"tabbrowser-tabs")
console.send_keys(Keys.LEFT_CONTROL + Keys.LEFT_SHIFT + 'k')
time.sleep(3)
scrpt = 'ifr = document.getElementById("duo_iframe"); cd(ifr); '
console.send_keys(scrpt + Keys.ENTER)
except Exception as error:
traceback.print_exc()
这将
- 导航到嵌入框架的网址
- 打开控制台
- 在该控制台中,使用Javascript找到框架并
cd
对其进行切换,切换到其DOM
。
Firefox console frame-selection menu在Selenium with Python
类似于以上内容:
from selenium.webdriver import Firefox,"tabbrowser-tabs")
console.send_keys(Keys.LEFT_CONTROL + Keys.LEFT_SHIFT + 'k')
time.sleep(3)
ifr = webdriver.find_element_by_class_name("devtools-toolbox-bottom-iframe")
webdriver.switch_to.frame(ifr)
btn = webdriver.find_element_by_id("command-button-frames")
btn.click()
except Exception as error:
traceback.print_exc()
这将是
- 导航到嵌入框架的网址
- 打开Web控制台
- 点击该控制台右上角的框架选择菜单
大概也可以在选项等之间循环,但是我还没有这样做。
,我不明白为什么不能直接使用 Selenium / geckodriver 访问跨源框架中的元素。
以下代码示例从域 A
加载页面,切换到包含来自域 iframe
的页面的 B
,让我直接访问 h1
元素并读出其文字:
driver.get("https://output.jsbin.com/gayeyanosi/2")
iframe = driver.find_element_by_css_selector("iframe") driver.switch_to.frame(iframe)
heading = driver.find_element_by_css_selector("h1")
断言heading.text ==“示例域”
已有几个 Firefox 和 geckodriver 版本对此提供支持。
如果它仍然不适合您,我建议您file an issue for geckodriver,然后attach a trace level log。然后我们可以详细调查问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。