写两个自动化工具是因为我操作 ifram 使用的是注入js的方法
ifram?
ifram 是嵌入在document 中的一个与当前 document 隔离的 document 如图
ifram 分为同域和不同域,不同域又分为:子级域名之间跨域 和 完全不同域名跨域
下面的两种 js 操作语句 针对于同域 和 完全不同域名跨域,后者页适用于子级域名之间跨域
文末我会给出参考链接有兴趣可以试一下(因为我没试)
1.js语句操作同域ifram
var ifm = document.getElementByid('ifm'); // 获取 ifram 元素
var dom = ifm.contentWindow.document // 取得 ifram 里的document
dom.getElementsByClassName('xxxxxxx').click() // 选择内部元素进行操作
// 合起来就是
document.getElementByid('ifm').contentWindow.document.getElementsByClassName('xxxxxxx').click()
playwright操作
jsif = "document.getElementByid('ifm').contentWindow.document.getElementsByClassName('xxxxxxx').click() "
page.evaluate(jsif)
selenium注入js 一搜一大把就不写了(我用的playwright 狗头)
2.js语句操作完全不同域名跨域ifram
大多数情况下都是不同域的,重点
'''
解决原理 取出 ifram 元素的地址 ,新建一个窗口完成操作后再跳转回来
例如开头的例子 他是一个内嵌的 登陆的 ifram,手动点击登录后会跳转到原来的页面,因此我们可
断定 ifram 中的 document 有重定向到原来页面的功能,所以无需新建窗口
如果你的 ifram 的 document 中没有重定向回来的功能,那么你就需要使用句柄的操作使主窗口
再回到原来的document(即 ifram 的父document) (当然我没搞这种,因为我还没遇到)
'''
# 登录 ifram 的代码实现
page.click("text=登录")
time.sleep(2)
login = page.evaluate('document.getElementById("contentIframe").src') # 取出 ifram 地址
page.goto(login)
time.sleep(2)
page.click('text=登录')
time.sleep(100)
|