Forced push due to filesystetm being corrupted. TThis is not usable yet.

This commit is contained in:
Eduard Tolosa 2023-02-09 18:40:24 -05:00
parent 9b48f2a6be
commit 374efd450d
No known key found for this signature in database
GPG key ID: 3A574A4009F553E5
5 changed files with 138 additions and 0 deletions

14
.rustfmt.toml Normal file
View file

@ -0,0 +1,14 @@
# Rustfmt configuration file.
# How imports should be grouped into use statements. Imports will be merged or split to the configured level of granularity.
imports_granularity = "One"
# Unix or Windows line endings
newline_style = "Unix"
# Convert /* */ comments to // comments where possible
normalize_comments = true
# Convert #![doc] and #[doc] attributes to //! and /// doc comments.
normalize_doc_attributes = true
# Remove nested parens.
remove_nested_parens = true
# Reorder impl items. type and const are put first, then macros and methods.
reorder_impl_items = true

11
Cargo.toml Normal file
View file

@ -0,0 +1,11 @@
[package]
name = "rushotter"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
futures = "0.3.25"
thirtyfour = "0.31.0"
tokio = "1.21.2"

1
src/args.rs Normal file
View file

@ -0,0 +1 @@

2
src/constants.rs Normal file
View file

@ -0,0 +1,2 @@
pub const CHROMEDRIVER_URL: &str = "http://127.0.0.1:9515";
pub const GECKODRIVER_URL: &str = "http://127.0.0.1:4444";

110
src/lib.rs Normal file
View file

@ -0,0 +1,110 @@
use {
constants::{CHROMEDRIVER_URL, GECKODRIVER_URL},
futures::StreamExt,
std::{
collections::HashMap,
path::{Path, PathBuf},
},
thirtyfour::prelude::*,
};
mod constants;
pub async fn take_chrome_screenshots(
driver: Option<WebDriver>,
chrome_args: Option<&[&str]>,
// The first argument is the URL to take a screenshot of and the second argument is the path to save the screenshot to.
// If the path is not provided, the screenshot will be saved to the current directory in the format of "url.png".
websites: HashMap<String, Option<String>>,
threads: Option<usize>,
) -> WebDriverResult<()> {
// Set the number of threads to use. Default to 5.
let threads = if let Some(threads) = threads {
threads
} else {
5
};
// Create a new ChromeCapabilities instance.
let mut caps = DesiredCapabilities::chrome();
caps.set_headless()?;
// Add any additional Chrome command line arguments.
if let Some(chrome_args) = chrome_args {
for arg in chrome_args {
caps.add_chrome_arg(arg)?;
}
}
// Create a new WebDriver instance.
let driver = if let Some(driver) = driver {
driver
} else {
WebDriver::new(CHROMEDRIVER_URL, caps).await?
};
println!("Taking screenshots...");
take_screenshots(websites, &driver, threads).await;
Ok(())
}
pub async fn take_firefox_screenshots(
driver: Option<WebDriver>,
firefox_args: Option<Vec<&str>>,
// The first argument is the URL to take a screenshot of and the second argument is the path to save the screenshot to.
// If the path is not provided, the screenshot will be saved to the current directory in the format of "url.png".
websites: HashMap<String, Option<String>>,
threads: usize,
) -> WebDriverResult<()> {
let mut caps = DesiredCapabilities::firefox();
caps.set_headless()?;
if let Some(firefox_args) = firefox_args {
for arg in firefox_args {
caps.add_firefox_arg(arg)?;
}
}
let driver = if let Some(driver) = driver {
driver
} else {
WebDriver::new(GECKODRIVER_URL, caps).await?
};
take_screenshots(websites, &driver, threads).await;
if driver.quit().await.is_err() {
println!("Failed to quit driver");
}
Ok(())
}
pub async fn take_screenshots(
websites: HashMap<String, Option<String>>,
driver: &WebDriver,
threads: usize,
) {
futures::stream::iter(websites.into_iter().map(|(website, screenshot_path)| {
let path = if let Some(screenshot_path) = screenshot_path {
Path::new(&screenshot_path).with_extension("png")
} else {
Path::new(&website).with_extension("png")
};
let fut = screenshot(driver.clone(), website, path);
tokio::spawn(fut)
}))
.buffer_unordered(threads)
.collect::<Vec<_>>()
.await;
}
pub async fn screenshot(driver: WebDriver, website: String, path: PathBuf) {
if driver.goto(&website).await.is_err() || driver.screenshot(&path).await.is_err() {
println!("Failed to take screenshot of {}", website);
}
}