ClericPy / ichrome

Chrome controller for Humans, based on Chrome Devtools Protocol(CDP) and python3.7+.
https://pypi.org/project/ichrome/
MIT License
228 stars 29 forks source link

tab.querySelectorAll() 似乎有个小问题 #77

Closed bluebad closed 2 years ago

bluebad commented 2 years ago

该方法的index参数,会通过方法内部的javascript代码模板嵌入,并且在执行过程中,忽略掉非index指定的项目,比如指定取第0个索引号的项目,那么非0索引的项目都被忽略了; 然后,从javascript代码出来后,

if isinstance(index, int):
    if result:
        return result[index]  # 这一个地方,如果index >= 0,那么result应该只有一项才对
    else:
        return TagNotFound()
else:
    return result

使用了这个判断,如果index非0,那会不会引起序号超标?

ClericPy commented 2 years ago

刚才又看了一下源码, index 非空的时候应该 return result[index] 返回单个 Tag 没问题, 越界的问题会被 if result: 提前避开

其实这里的 index 主要目的就是避免 js 传回太大数据, 一般只要一条, 传回几十条浪费

bluebad commented 2 years ago

index==0没问题

bluebad commented 2 years ago

最近被iframe的问题绊住了

ClericPy commented 2 years ago

iframe 貌似得折腾 DOM domain 里面的 nodeId 什么的, 我嫌麻烦一般要么跳转到 iframe 里, 要么 JS 去操作

bluebad commented 2 years ago

iframe 貌似得折腾 DOM domain 里面的 nodeId 什么的, 我嫌麻烦一般要么跳转到 iframe 里, 要么 JS 去操作

跳转?用tab.goto()?频繁地用js,会让代码显得非常细碎。

bluebad commented 2 years ago

你这个asyncio+cdp的框架挺好的,让Python进入到CDP,和puppeteer竞争。 只是,可以走得更远,更完善些。多借鉴puppeteer、selenium的接口。像只支持css selector,不能在html element元素上执行进一步操作等,非常不方便。

ClericPy commented 2 years ago

和 他们 竞争... 他们是一个团队和开源组织, 我就一个业余的...

你可以试试 pyppeteer 和 playwright, 都比我厉害多了, 前几天看了一眼 pyppeteer 才发现他们早就开始基于 browser Websocket + flatten 模式操作标签页了, 我却还在对着 tab Websocket 操作, 确实差太远了

他们的其实把各种 Domain 像你说的对象化了很方便, 这个对我来说开发成本和测试成本有点难接受, 所以只打包了几个常用的功能, 连抽象都懒得做...

JS 其实比想象中强大, 学起来也没什么成本, 作为浏览器一等公民, 我日常还是以 JS 去操作为主, 兼容性更高而且稳定, 只有特别底层的比如抓包篡改流量或者驱动层面的操作才走 CDP.

JS 只要抽象做好不会细碎的, 都摸了前端了, 避不开 Javascript 的

ClericPy commented 2 years ago

非 flatten 模式(也就是我现在用的) 看官方的意思打算淘汰了. 以后可能就开一个 ws, 通过不同 SessionID 来隔离流量, ichrome 这点有点落后了, 最近两周在考虑支持上它, 还得向后兼容. 一开始没认真设计抽象, 现在果然吃亏

bluebad commented 2 years ago

期待。从ichrome的代码中,还是能学到不少东西的。