点击事件触发时什么都不做
Click event does nothing when triggered
当我在 puppeteer 中以非无头模式触发 .click()
事件时,没有任何反应,甚至没有错误.. "non-headless mode so i could visually monitor what is being clicked"
const scraper = {
test: async () => {
let browser, page;
try {
browser = await puppeteer.launch({
headless: false,
args: ["--no-sandbox", "--disable-setuid-sandbox"]
});
page = await browser.newPage();
} catch (err) {
console.log(err);
}
try {
await page.goto("https://www.betking.com/sports/s/eventOdds/1-840-841-0-0,1-1107-1108-0-0,1-835-3775-0-0,", {
waitUntil: "domcontentloaded"
});
console.log("scraping, wait...");
} catch (err) {
console.log(err);
}
console.log("waiting....");
try {
await page.waitFor('.eventsWrapper');
} catch (err) {
console.log(err, err.response);
}
try {
let oddsListData = await page.evaluate(async () => {
let regionAreaContainer = document.querySelectorAll('.areaContainer.region .regionGroup > .regionAreas > div:first-child > .area:nth-child(5)');
regionAreaContainer = Array.prototype.slice.call(regionAreaContainer);
let t = []; //Used to monitor the element being clicked
regionAreaContainer.forEach(async (region) => {
let dat = await region.querySelector('div');
dat.innerHTML === "GG/NG" ? t.push(dat.innerHTML) : false; //Used to confirm that the right element is being clicked
dat.innerHTML === "GG/NG" ? dat.click() : false;
})
return t;
})
console.log(oddsListData);
} catch (err) {
console.log(err);
}
}
}
我希望它点击指定的按钮并加载页面上的一些动态数据。
在 Chrome 的控制台中,我收到错误
Transition Rejection($id: 1 type: 2, message: The transition has been superseded by a different transition, detail: Transition#3( 'sportsMultipleEvents'{"eventMarketIds":"1-840-841-0-0,1-1107-1108-0-0,1-835-3775-0-0,"} -> 'sportsMultipleEvents'{"eventMarketIds":"1-840-841-0-0,1-1107-1108-0-0,1-835-3775-535-14,"} ))
这里可能是一种不那么令人困惑的点击方式:
for(var div of document.querySelectorAll('div')){
if(div.innerHTML === 'GG/NG') div.click()
}
问题
通过执行 element.click()
(在页面上下文中)或 element.value = '..'
(参见 类似的问题)似乎对 Angular 应用程序有问题。您想通过使用像 page.click()
这样的人偶函数来尝试表现得更 人性化 ,因为它们模拟 "real" 鼠标单击而不是仅仅触发元素的单击事件。
此外,每当单击其中一项时,页面似乎都会重建部分页面。因此每次点击后都需要重新执行选择器
代码示例
为了更人性化并在每次点击后重新查询元素,您可以将代码的后半部分更改为如下所示:
let list = await page.$x("//div[div/text() = 'GG/NG']");
for (let i = 0; i < list.length; i++) {
await list[i].click();
// give the page some time and then query the selectors again
await page.waitFor(500);
list = await page.$x("//div[div/text() = 'GG/NG']");
}
此代码使用 XPath 表达式来查询 div
元素,其中包含另一个具有给定文本的 div
元素。之后,在元素上模拟点击,然后再次查询页面内容以尊重 DOM 元素的变化。
当我在 puppeteer 中以非无头模式触发 .click()
事件时,没有任何反应,甚至没有错误.. "non-headless mode so i could visually monitor what is being clicked"
const scraper = {
test: async () => {
let browser, page;
try {
browser = await puppeteer.launch({
headless: false,
args: ["--no-sandbox", "--disable-setuid-sandbox"]
});
page = await browser.newPage();
} catch (err) {
console.log(err);
}
try {
await page.goto("https://www.betking.com/sports/s/eventOdds/1-840-841-0-0,1-1107-1108-0-0,1-835-3775-0-0,", {
waitUntil: "domcontentloaded"
});
console.log("scraping, wait...");
} catch (err) {
console.log(err);
}
console.log("waiting....");
try {
await page.waitFor('.eventsWrapper');
} catch (err) {
console.log(err, err.response);
}
try {
let oddsListData = await page.evaluate(async () => {
let regionAreaContainer = document.querySelectorAll('.areaContainer.region .regionGroup > .regionAreas > div:first-child > .area:nth-child(5)');
regionAreaContainer = Array.prototype.slice.call(regionAreaContainer);
let t = []; //Used to monitor the element being clicked
regionAreaContainer.forEach(async (region) => {
let dat = await region.querySelector('div');
dat.innerHTML === "GG/NG" ? t.push(dat.innerHTML) : false; //Used to confirm that the right element is being clicked
dat.innerHTML === "GG/NG" ? dat.click() : false;
})
return t;
})
console.log(oddsListData);
} catch (err) {
console.log(err);
}
}
}
我希望它点击指定的按钮并加载页面上的一些动态数据。
在 Chrome 的控制台中,我收到错误
Transition Rejection($id: 1 type: 2, message: The transition has been superseded by a different transition, detail: Transition#3( 'sportsMultipleEvents'{"eventMarketIds":"1-840-841-0-0,1-1107-1108-0-0,1-835-3775-0-0,"} -> 'sportsMultipleEvents'{"eventMarketIds":"1-840-841-0-0,1-1107-1108-0-0,1-835-3775-535-14,"} ))
这里可能是一种不那么令人困惑的点击方式:
for(var div of document.querySelectorAll('div')){
if(div.innerHTML === 'GG/NG') div.click()
}
问题
通过执行 element.click()
(在页面上下文中)或 element.value = '..'
(参见 page.click()
这样的人偶函数来尝试表现得更 人性化 ,因为它们模拟 "real" 鼠标单击而不是仅仅触发元素的单击事件。
此外,每当单击其中一项时,页面似乎都会重建部分页面。因此每次点击后都需要重新执行选择器
代码示例
为了更人性化并在每次点击后重新查询元素,您可以将代码的后半部分更改为如下所示:
let list = await page.$x("//div[div/text() = 'GG/NG']");
for (let i = 0; i < list.length; i++) {
await list[i].click();
// give the page some time and then query the selectors again
await page.waitFor(500);
list = await page.$x("//div[div/text() = 'GG/NG']");
}
此代码使用 XPath 表达式来查询 div
元素,其中包含另一个具有给定文本的 div
元素。之后,在元素上模拟点击,然后再次查询页面内容以尊重 DOM 元素的变化。