2024-09-09 18:43:20 -04:00
|
|
|
// Solution by Ethan Ruszanowski
|
2024-09-09 16:34:06 -04:00
|
|
|
const { chromium } = require("playwright");
|
|
|
|
|
|
|
|
async function sortHackerNewsArticles() {
|
|
|
|
// launch browser
|
|
|
|
const browser = await chromium.launch({ headless: false });
|
|
|
|
const context = await browser.newContext();
|
|
|
|
const page = await context.newPage();
|
|
|
|
|
|
|
|
// go to Hacker News
|
|
|
|
await page.goto("https://news.ycombinator.com/newest");
|
2024-09-09 18:43:20 -04:00
|
|
|
|
|
|
|
// instantiate array for all date objects
|
|
|
|
let datestamps = []
|
|
|
|
|
|
|
|
// loop through process per page
|
|
|
|
for (var pageview = 0; pageview <= 3; pageview++) {
|
|
|
|
// locate each article's age span
|
|
|
|
let datespans = await page.locator('.age').all();
|
|
|
|
|
|
|
|
// iterate through date spans to get timestamps
|
|
|
|
for (row = 0; row < datespans.length; row++) {
|
|
|
|
// turn timestamp strings into date objects and push to array
|
|
|
|
datestamps.push(new Date(await datespans[row].getAttribute('title')));
|
|
|
|
}
|
|
|
|
|
|
|
|
// click the next button as needed
|
|
|
|
await page.getByRole('link', { name: 'More', exact: true }).click();
|
|
|
|
}
|
|
|
|
|
|
|
|
// drop extra articles from last page grab
|
|
|
|
datestamps = datestamps.slice(0, 100);
|
|
|
|
|
|
|
|
// report results
|
|
|
|
if (datestamps === datestamps.sort()) {
|
|
|
|
console.log("Success! The first 100 articles are correctly sorted by posting time.")
|
|
|
|
} else {
|
|
|
|
console.log("Failure… The first 100 articles are not correctly sorted by posting time.")
|
|
|
|
}
|
2024-09-09 16:34:06 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
(async () => {
|
|
|
|
await sortHackerNewsArticles();
|
|
|
|
})();
|