Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 18 additions & 5 deletions src/chrome.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
use super::*;

use std::process::{Command, Child, Stdio};
use std::sync::Arc;
use std::thread;
use std::time::Duration;

Expand Down Expand Up @@ -41,15 +42,22 @@ impl ChromeDriverBuilder {
// TODO: parameterize this
thread::sleep(Duration::new(1, 500));
Ok(ChromeDriver {
child: child,
url: format!("http://localhost:{}", port),
kill_on_drop: self.kill_on_drop,
inner: Arc::new(ChromeDriverInner {
child: child,
url: format!("http://localhost:{}", port),
kill_on_drop: self.kill_on_drop,
}),
})
}
}

/// A chromedriver process
#[derive(Clone)]
pub struct ChromeDriver {
inner: Arc<ChromeDriverInner>,
}

struct ChromeDriverInner {
child: Child,
url: String,
kill_on_drop: bool,
Expand All @@ -62,9 +70,14 @@ impl ChromeDriver {
pub fn build() -> ChromeDriverBuilder {
ChromeDriverBuilder::new()
}

/// Start a session for this driver
pub fn session(&self, params: &NewSessionCmd) -> Result<DriverSession, Error> where Self : Sized + 'static {
DriverSession::create_session(Box::new(self.clone()), params)
}
}

impl Drop for ChromeDriver {
impl Drop for ChromeDriverInner {
fn drop(&mut self) {
if self.kill_on_drop {
let _ = self.child.kill();
Expand All @@ -74,6 +87,6 @@ impl Drop for ChromeDriver {

impl Driver for ChromeDriver {
fn url(&self) -> &str {
&self.url
&self.inner.url
}
}
20 changes: 20 additions & 0 deletions tests/webdriver_client_integration.rs
Original file line number Diff line number Diff line change
Expand Up @@ -465,6 +465,26 @@ macro_rules! browser_tests {
browser_tests!(firefox, TestBrowser::Firefox);
browser_tests!(chrome, TestBrowser::Chrome);

#[test]
fn launch_multiple_chromes() {
ensure_logging_init();

let new_session_command = TestBrowser::Chrome.new_session_cmd();

let server = FileServer::new();
let chromedriver = ChromeDriver::build().spawn().unwrap();
let chrome1 = chromedriver.clone().session(&new_session_command).expect("Error starting first browser");
let chrome2 = chromedriver.session(&new_session_command).expect("Error starting second browser");

let page1 = server.url("/page1.html");
let page2 = server.url("/page2.html");
chrome1.go(&page1).expect("Error getting page1");
chrome2.go(&page2).expect("Error getting page2");

assert_eq!(&chrome1.get_current_url().expect("Error getting url 1"), &page1);
assert_eq!(&chrome2.get_current_url().expect("Error getting url 2"), &page2);
}

fn ensure_logging_init() {
static DONE: Once = ONCE_INIT;
DONE.call_once(|| init_logging());
Expand Down