- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
任何人都知道如何 调用 javascript 函数 来自 puppeteer 师这不是内联的,而是在 中外部.js 文件。如果它在 html->head->script 标记中内联,则它可以工作,但如果脚本标记指向外部 .js 文件,则不能
示例 HTML 文件
<html>
<head>
<script type="text/javascript">
function inlineFunction() {
window.location.replace('https://www.geeksforgeeks.org');
}
</script>
<script src="script.js" type="text/javascript">
</script>
</head>
<body>
<p>Hello</p>
<p>this is an online html</p>
<p>Link with tag a <a href="https://www.geeksforgeeks.org" name="arivalink">Href Link</a></p>
<p>Link with inline java script - <a href="#" onClick='inlineFunction();'>Inline JS link</a></p><!-- Works -->
<p>Link with external JS file w/o tagname - <a href="#" onClick='fileFunction();'>Ext JS Link</a></p><!-- Does not work -->
<p>Link with external JS file w/ tagname - <a href="#" onClick='fileFunction();' name="geeksLink">Ext JS Link</a></p><!-- Does not work -->
</body>
</html>
示例 Javascript 文件
/*----------------------------------------------------*/
/* External Javascript File */
/*----------------------------------------------------*/
function fileFunction() {
window.location.replace('https://www.geeksforgeeks.org');
}
Puppeteer 代码示例
const puppeteer = require('puppeteer');
async function start() {
const browser = await puppeteer.launch({
headless: false
});
const page = await browser.newPage();
//Change the path of "url" to your local path for the html file
const url = 'file:///Users/sam.gajjar/SG/Projects/headless-chrome/sample.html';
var link = '[name="link"]';
console.log("Main URL Called");
await page.goto(url);
console.log("Link via HTML tag A called");
await page.click(link);
await page.waitForTimeout(5000) // Wait 5 seconds
.then(() => page.goBack());
console.log("Callng inline JS Function");
await page.evaluate(() => inlineFunction());
await page.waitForTimeout(5000) // Wait 5 seconds
.then(() => page.goBack());
console.log("Callng extjs file Function");
await page.evaluate(() => fileFunction());
await page.waitForTimeout(5000) // Wait 5 seconds
.then(() => page.goBack());
// console.log("Callng extjs file Function w/tag name");
// const element = await page.$$('[a href="#"]');
// await page.waitForTimeout(5000)
// .then(() => page.goBack());
}
start();
最佳答案
首先,[name="link"]
应该是 [name="arivalink"]
匹配你的 DOM。我认为这是一个错字。
另外,我建议使用 Promise.all
navigation pattern而不是 waitForTimeout
这可能会导致竞争条件(尽管在这种情况下这似乎与问题无关)。
至于主要问题,外部文件工作得很好,所以这是一个红鲱鱼。您可以通过调用 page.evaluate(() => fileFunction())
来证明这一点在导航到 sample.html
之后.
真正的问题是,当您使用 window.location.replace('https://www.geeksforgeeks.org');
导航时, Chromium 不会将该操作推送到历史堆栈中。它正在替换当前的 URL,所以 page.goBack()
回到原来的about:blank
而不是 sample.html
如你所料。 about:blank
没有 fileFunction
在里面,所以 Puppeteer 扔了。
现在,当您单击 [name="link"]
使用 Puppeteer,确实会推送历史堆栈,所以 goBack
工作得很好。
您可以通过加载 sample.html
来重现此行为在浏览器中并在没有 Puppeteer 的情况下手动导航。
长话短说,如果您在浏览器上下文中使用 evaluate
调用函数运行 window.location.replace
, 你不能依赖 page.goBack
.您需要使用 page.goto
返回 sample.html
.
有一个有趣的细微差别:如果你使用 page.click
调用运行 location.replace("...")
的 JS , Puppeteer 将推送历史堆栈和page.goBack
将按预期运行。如果您使用 page.evaluate(() => location.replace("..."));
调用相同的 JS 逻辑, Puppeteer 不会将当前 URL 推送到历史堆栈和 page.goBack
不会像你期望的那样工作。 evaluate
行为更符合“手动”浏览(即作为一个在 GUI 上使用鼠标和键盘的人)。
这是演示所有这些的代码。一切都在同一个目录和node index.js
运行 Puppeteer(我使用 Puppeteer 9.0.0)。
脚本.js
const replaceLocation = () => location.replace("https://www.example.com");
const setLocation = () => location = "https://www.example.com";
示例.html
<!DOCTYPE html>
<html lang="en">
<head>
<title>sample</title>
</head>
<body>
<div>
<a href="https://www.example.com">normal link</a> |
<a href="#" onclick="replaceLocation()">location.replace()</a> |
<a href="#" onclick="setLocation()">location = ...</a>
</div>
<script src="script.js"></script>
</body>
</html>
index.js
const puppeteer = require("puppeteer");
const url = "file:///Users/sam.gajjar/SG/Projects/headless-chrome/sample.html";
const log = (() => {
let logId = 0;
return (...args) => console.log(logId++, ...args);
})();
let browser;
(async () => {
browser = await puppeteer.launch({
headless: false,
slowMo: 500,
});
const [page] = await browser.pages();
await page.goto(url);
// display the starting location
log(page.url()); // 0 sample.html
// click the normal link and pop the browser stack with goBack
await Promise.all([
page.waitForNavigation(),
page.click("a:nth-child(1)"),
]);
log(page.url()); // 1 example.com
await page.goBack();
log(page.url()); // 2 sample.html
// fire location.replace with click
await Promise.all([
page.waitForNavigation(),
page.click("a:nth-child(2)"), // pushes history (!)
]);
log(page.url()); // 3 example.com
await page.goBack();
log(page.url()); // 4 sample.html
// fire location.replace with evaluate
await Promise.all([
page.waitForNavigation(),
page.evaluate(() => replaceLocation()), // doesn't push history
]);
log(page.url()); // 5 example.com
await page.goBack();
log(page.url()); // 6 about:blank <--- here's your bug!
await page.goto(url); // go to sample.html from about:blank <-- here's the fix
log(page.url()); // 7 sample.html
// use location = and see that goBack takes us to sample.html
await Promise.all([
page.waitForNavigation(),
page.evaluate(() => setLocation()), // same behavior as page.click
]);
log(page.url()); // 8 example.com
await page.goBack();
log(page.url()); // 9 sample.html
})()
.catch(err => console.error(err))
.finally(async () => await browser.close())
;
关于javascript - Puppeteer 从外部 .js 文件调用 javascript 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67539195/
为了让我的代码几乎完全用 Jquery 编写,我想用 Jquery 重写 AJAX 调用。 这是从网页到 Tomcat servlet 的调用。 我目前情况的类似代码: var http = new
我想使用 JNI 从 Java 调用 C 函数。在 C 函数中,我想创建一个 JVM 并调用一些 Java 对象。当我尝试创建 JVM 时,JNI_CreateJavaVM 返回 -1。 所以,我想知
环顾四周,我发现从 HTML 调用 Javascript 函数的最佳方法是将函数本身放在 HTML 中,而不是外部 Javascript 文件。所以我一直在网上四处寻找,找到了一些简短的教程,我可以根
我有这个组件: import {Component} from 'angular2/core'; import {UserServices} from '../services/UserService
我正在尝试用 C 实现一个简单的 OpenSSL 客户端/服务器模型,并且对 BIO_* 调用的使用感到好奇,与原始 SSL_* 调用相比,它允许一些不错的功能。 我对此比较陌生,所以我可能会完全错误
我正在处理有关异步调用的难题: 一个 JQuery 函数在用户点击时执行,然后调用一个 php 文件来检查用户输入是否与数据库中已有的信息重叠。如果是这样,则应提示用户确认是否要继续或取消,如果他单击
我有以下类(class)。 public Task { public static Task getInstance(String taskName) { return new
嘿,我正在构建一个小游戏,我正在通过制作一个数字 vector 来创建关卡,该数字 vector 通过枚举与 1-4 种颜色相关联。问题是循环(在 Simon::loadChallenge 中)我将颜
我有一个java spring boot api(数据接收器),客户端调用它来保存一些数据。一旦我完成了数据的持久化,我想进行另一个 api 调用(应该处理持久化的数据 - 数据聚合器),它应该自行异
首先,这涉及桌面应用程序而不是 ASP .Net 应用程序。 我已经为我的项目添加了一个 Web 引用,并构建了各种数据对象,例如 PayerInfo、Address 和 CreditCard。但问题
我如何告诉 FAKE 编译 .fs文件使用 fsc ? 解释如何传递参数的奖励积分,如 -a和 -target:dll . 编辑:我应该澄清一下,我正在尝试在没有 MSBuild/xbuild/.sl
我使用下划线模板配置了一个简单的主干模型和 View 。两个单独的 API 使用完全相同的配置。 API 1 按预期工作。 要重现该问题,请注释掉 API 1 的 URL,并取消注释 API 2 的
我不确定什么是更好的做法或更现实的做法。我希望从头开始创建目录系统,但不确定最佳方法是什么。 我想我在需要显示信息时使用对象,例如 info.php?id=100。有这样的代码用于显示 Game.cl
from datetime import timedelta class A: def __abs__(self): return -self class B1(A):
我在操作此生命游戏示例代码中的数组时遇到问题。 情况: “生命游戏”是约翰·康威发明的一种细胞自动化技术。它由一个细胞网格组成,这些细胞可以根据数学规则生存/死亡/繁殖。该网格中的活细胞和死细胞通过
如果我像这样调用 read() 来读取文件: unsigned char buf[512]; memset(buf, 0, sizeof(unsigned char) * 512); int fd;
我用 C 编写了一个简单的服务器,并希望调用它的功能与调用其他 C 守护程序的功能相同(例如使用 ./ftpd start 调用它并使用 ./ftpd stop 关闭该实例)。显然我遇到的问题是我不知
在 dos 中,当我粘贴此命令时它会起作用: "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" https://google.
在 dos 中,当我粘贴此命令时它会起作用: "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" https://google.
我希望能够从 cmd 在我的 Windows 10 计算机上调用 python3。 我已重新安装 Python3.7 以确保选择“添加到路径”选项,但仍无法调用 python3 并使 CMD 启动 P
我是一名优秀的程序员,十分优秀!