Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 木偶演员page.click有效,但page.evaluate+;文档点击不';行不通_Javascript_Puppeteer - Fatal编程技术网

Javascript 木偶演员page.click有效,但page.evaluate+;文档点击不';行不通

Javascript 木偶演员page.click有效,但page.evaluate+;文档点击不';行不通,javascript,puppeteer,Javascript,Puppeteer,我看过很多帖子(例如,请看和),说我可以通过下面的代码点击一些东西 等待页面。单击('.route redirect box');//通过傀儡玩家页面。点击 等待页面。评估((css_选择器)=>{ document.querySelector(css_选择器)。单击();//或通过page.evaluate },css); 但是,正如我在一些网站上测试的那样,它看起来像page。单击始终有效,但page。使用headless:false模式评估则无效 比如这个页面,我试着点击如下内容 var

我看过很多帖子(例如,请看和),说我可以通过下面的代码点击一些东西

等待页面。单击('.route redirect box');//通过傀儡玩家页面。点击
等待页面。评估((css_选择器)=>{
document.querySelector(css_选择器)。单击();//或通过page.evaluate
},css);
但是,正如我在一些网站上测试的那样,它看起来像
page。单击
始终有效,但
page。使用
headless:false
模式评估
则无效

比如这个页面,我试着点击如下内容

var css='#searchPaginationTop>nav>a:n子项(5)';
等待页面。评估((css_选择器)=>{document.querySelector(css_选择器)。单击();},css);
什么也没发生,但如果我使用
页面。单击
,它会按预期工作

我认为,我想要单击的元素不是一个普通的可单击元素,因为该元素的html代码如下所示



可能是因为这个元素是一些
数据ga
东西,所以
页面。evaluate
不能点击它吗?

从我所能看出,内容似乎是动态注入的。 这意味着,通过使用木偶演员,你可以等待它发生后再继续。这样做应该可以(我自己不能复制,因为我不知道如何触发导航更新):

简短回答
  • page.evaluate(()=>document.querySelector('SELECTOR')。单击())仅触发
    单击事件
  • 页面。单击(“选择器”)
    尝试在单击时模仿人类行为
解释 让我们检查这两种方法的文档,以真正了解正在发生的事情

page.evaluate(()=>document.querySelector('SELECTOR')。单击())
让我们看看这本书是怎么说的:

[…]它触发元素的单击事件

这就是它的全部功能。它只是触发
click
事件,以便调用所有侦听元素的click事件的处理程序。这意味着,它不关心元素是否在当前视口之外。该元素甚至可能被隐藏(通过CSS),而
click
事件仍然会触发

让我们将其与“木偶演员方式”进行比较:

页面。单击
有关
页面的部分。单击

此方法使用
选择器
获取元素,如果需要,将其滚动到视图中,然后使用在元素中心单击。[……]

也就是说,那个木偶演员在这里模仿人类的行为。首先,将元素滚动到视图中,然后将鼠标移动到元素顶部(在途中触发任何其他事件,如
mouseover
mouseenter
,等等)。最后,通过模拟鼠标单击按钮(参见木偶演员代码中的相应类)。这还会触发任何相关事件(如
mousedown

当您自己触发JavaScript事件时,复杂的UI库可能不喜欢它。请记住,它们通常是为人机交互而优化的,而不是为与机器人的交互而优化的。这意味着,UI库可能会侦听
mousedown
mouseenter
事件(例如),而不是直接侦听
click
事件

表现“人性化” 与未知网站互动时,最好尽量表现得像人一样。即使是没有任何特定“反机器人”措施的页面,也可能使用预期特定事件流的框架

顺便说一下,你不是唯一一个有这个问题的人。查看以下问题以了解类似问题:


对我来说,没有显示
#searchPaginationTop
的子项。我可以想象,它将被动态注入,也就是说,您需要等待相应的JavaScript运行。@Ryuno Ki,css是通过Chrome inspect工具复制的,我不确定这是否是动态注入的。那么,我如何才能等待相应的JS运行呢?请在回答中显示一些代码示例好吗?a没有href或onClick,因此除非有其他事件侦听器,否则单击它时不会发生任何事情。@avocado这与
木偶演员的工作方式无关。如果打开浏览器页面并打开开发工具控制台并执行
document.querySelector(“#searchPaginationTop>nav>a:nth child(5)”。单击()
也不会发生任何事情。这是因为这不是一个直接链接,但是JS应用程序处理鼠标事件。它甚至可以注册一个全局窗口事件来捕获所有
鼠标向下
/
单击
事件。他们有一个大家庭@鳄梨为什么要使用javascript进行点击?木偶演员点击法有什么问题?要在浏览器JS中实现这一点,您必须反转JS代码并查看鼠标事件是如何注册/处理的(甚至可以将其定位到github源代码中),或者随机尝试使用and进行实验。我添加了
waitForSelector
,但仍然
evaluate
不起作用。您能否添加一些关于如何进入状态的说明,是否填充了
#searchPaginationTop
?否则我帮不了你。对不起,我还不知道怎么做,但我想这里的问题可能是@pguardiario在评论中说的。非常感谢您的详细解释,:-)
await page.click('.route-redirect-box');
const css = '#searchPaginationTop > nav > a:nth-child(5)';
await page.waitForSelector(css);
await page.evaluate((css_selector) => { document.querySelector(css_selector).click();}, css);