Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

If a PHPUnit test appears to stop when it uses PhantomJS, first find the last WebDriver command that completed and identify which process is still alive. The pause may be an unmet page condition, a PhantomJS/GhostDriver problem, or PHPUnit waiting on a child process; the symptom alone does not establish the cause. Work through the checks below before changing timeouts. PhantomJS is archived, so if the failure is specific to it, plan to assess a maintained browser and driver combination.

Start by locating the stall

Record what happened immediately before the test stopped. PHPUnit’s last printed test name is useful, but the important detail is the last browser command that returned: session creation, navigation, title lookup, element search, script execution, or teardown. Then inspect the process tree to see whether PHPUnit, a PHP child, PhantomJS, or the Selenium server remains running.

A historic question phrases the symptom as “PHPUnit, Selenium, and Firefox work, but when I try it with PhantomJS, nothing happens.” That is one report, not a diagnosis. Firefox succeeding narrows the investigation, but does not by itself prove a PhantomJS defect or rule out a difference in page readiness, browser behavior, or environment.

Build a reproducible baseline

Before changing configuration, capture the details needed to compare a working run with a stalled one:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
  • PHP and PHPUnit versions, including whether PHPUnit process isolation is enabled.
  • Selenium server and PHP WebDriver binding versions.
  • PhantomJS version and the full path of the executable PHPUnit launches.
  • Operating system, shell, user account, container or CI image, and whether the result differs locally.
  • Test timeout settings, final PHPUnit output, and the last WebDriver operation known to have completed.
  • PHPUnit, Selenium, and PhantomJS/GhostDriver logs, including standard output and standard error where available.

Keep the logs from the same run together. Compatibility depends on the actual versions in use: the php-webdriver project documentation covers Selenium 2.x, 3.x, and 4.x and emphasizes matching browser and driver versions. Check its guidance against your installed client, server, browser, and driver rather than assuming that a setup working with Firefox is compatible with PhantomJS.

Check for a synchronization wait before raising timeouts

A browser test can look frozen while it is waiting for something that never becomes true: navigation to finish, an element to appear, a title to change, an asynchronous script to return, or a network-dependent part of the page to settle. Selenium’s official WebDriver troubleshooting guidance says, “The most common Selenium-related error is a result of poor synchronization.” It recommends trying an explicit wait when synchronization is suspected.

  1. Identify the exact operation that has not returned. If the log ends after navigation, investigate page loading; if navigation returned but a later element lookup blocks or fails, investigate the condition that test expects.
  2. State the condition the next test step actually needs—for example, a particular element becoming visible or a known title appearing—instead of assuming that a fixed sleep means the application is ready.
  3. Use the explicit-wait mechanism supported by the PHP binding version in your project, and give it a bounded timeout. On expiry, report the condition and elapsed wait so a stalled run becomes a diagnosable failure.
  4. Check whether the condition can ever occur in the test environment: inspect the application response, JavaScript errors, redirects, and any required network calls.

A larger timeout can be a temporary diagnostic if a slow page is plausible, but it is not a fix for a condition that never occurs. Avoid changing several timeout values at once: it obscures which wait was responsible and can turn a quick failure into a long, opaque stall.

Rank #2
Sale
HTML and CSS: Design and Build Websites
  • HTML CSS Design and Build Web Sites
  • Comes with secure packaging
  • It can be a gift option

Verify the PhantomJS executable and turn on driver logs

Run the version and path check from the same shell, user, container, and PATH that launches PHPUnit. PhantomJS troubleshooting warns that multiple installed versions can conflict; a local terminal may therefore invoke a different binary from CI or from the test runner. The official PhantomJS troubleshooting documentation describes the version check and related debugging options. These are legacy instructions, not an indication that PhantomJS is currently maintained.

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

PhantomJS’s command-line documentation is for the 2.1.1 line and documents WebDriver mode and its logging flags. Start the binary in WebDriver mode with the log file and log level options, using the exact executable and options your test setup requires:

phantomjs --webdriver=8910 --webdriver-logfile=/tmp/phantomjs-webdriver.log --webdriver-loglevel=DEBUG

Then configure the test’s Selenium endpoint to use the port you selected, and preserve the log from the run that stalls. Confirm whether a session was created and find the last command GhostDriver received. Do not treat this example as a universal launch command: wrapper scripts, ports, and server arrangements differ between projects.

If the log stops during startup, focus on executable selection, process permissions, port use, or session creation. If session creation succeeds but a command never completes, compare that command with the last successful one and investigate the browser, page, and driver interaction. PhantomJS documentation also describes page error handling with page.onError, resource callbacks such as onResourceRequested, and remote debugging through --remote-debugger-port. Those may help expose a JavaScript exception or stalled request, though the tooling can be awkward in a modern environment.

Run a minimal case in another browser

Reduce the test to one session and the smallest useful scenario: open a known page, check one condition, and quit. Run that scenario with PhantomJS and a second browser driver, keeping the page, test code, Selenium endpoint, and environment as similar as possible. Selenium recommends trying commands in multiple browsers to help distinguish driver problems from other failures.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
  • Only PhantomJS stalls: investigate PhantomJS/GhostDriver behavior, a WebDriver command it does not handle as expected, page JavaScript compatibility, or network and TLS differences. Verify the executable and review its driver log before changing application waits.
  • Both browsers stall at the same action: investigate application readiness, the server response, the synchronization condition, and test code. A browser-specific migration alone may not solve a shared wait problem.
  • They fail at different points: compare browser-specific page behavior and the exact WebDriver command sequence. A passing browser is a useful contrast, not proof that every test assumption is correct.

PhantomJS documents embedded WebDriver mode and a Selenium Grid hub option, but these interfaces belong to its 2.1.1 documentation line. Check the exact mode and compatibility of your installation rather than carrying old setup assumptions into a different Selenium generation.

Rank #4
Sale
Web Design with HTML, CSS, JavaScript and jQuery Set
  • Brand: Wiley
  • Set of 2 Volumes
  • A handy two-book set that uniquely combines related technologies Highly visual format and accessible language makes these books highly effective learning tools Perfect for beginning web designers and front-end developers

Check whether PHPUnit or process cleanup is blocked

The browser may not be the process holding the test open. While a run is stalled, inspect which processes remain and whether their output pipes are active. PHPUnit can be waiting on a child process, PHP can be blocked reading a stream, PhantomJS can remain alive after the test has moved on, or a browser process can exit while the client waits for a response.

A PHPUnit issue #5993, opened in 2024, reports an indefinite hang involving process-isolated tests and large child-process stderr output in a specific environment: PHPUnit 10.5.36 and PHP 8.3.12. The report describes a blocking stream read; it is a diagnostic lead, not evidence that PhantomJS caused a particular stall. If your run uses process isolation, compare its behavior with isolation disabled where safe, and inspect how much the child writes to stderr.

Also verify teardown: the WebDriver session should be closed and PhantomJS should exit. A historical Selenium issue #349 describes a client waiting roughly a minute before reporting that ChromeDriver had exited immediately. It illustrates how a timeout can mask an earlier driver exit; it is neither current compatibility guidance nor PhantomJS-specific proof.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Repair the test or move off PhantomJS?

The PhantomJS repository is archived and read-only. A historical PhantomJS issue #15314 records Selenium 3.8.1 deprecating PhantomJS as a WebDriver and suggesting headless Chrome or Firefox as alternatives. That history does not establish which browser and driver versions your project should use today; verify current compatibility for your Selenium client/server, browser, driver, PHP binding, and CI environment.

Decision factor What to establish
Version compatibility Whether the project’s installed Selenium client/server, PHP binding, browser, and driver versions are compatible, using the php-webdriver documentation as a reference.
Scope of the failure Whether the same minimal scenario stalls only under PhantomJS or also in another browser, following Selenium’s cross-browser troubleshooting approach.
Maintenance PhantomJS is archived and read-only; its historical Selenium deprecation is documented in issue #15314.
Operational fit Whether your current CI image can install, launch, and maintain the alternative browser/driver reliably. This must be checked in your own project and environment.

For a short-lived legacy suite, fixing a confirmed synchronization or PATH error may be the lowest-effort way to restore a run. For tests that will be maintained, weigh that repair against migration effort and the support status of the browser stack. Do not assume that changing browsers fixes application readiness, process isolation, or teardown defects; carry the minimal reproducer and bounded waits into the alternative setup.

Or skip the browser setup

If your goal is a website capture rather than interactive browser testing, ScreenshotNeo is a website screenshot API and MCP server for developers. A single GET request can return a PNG, JPEG, WebP, or PDF. Use an API key and replace the target URL as needed:

curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp

See the ScreenshotNeo API documentation for request options. This is not a replacement for PHPUnit/Selenium interaction tests: it is an alternative when you need a rendered page capture. It accepts cookie/consent banners and removes more than 60 known consent platforms, newsletter popups, and chat widgets before capture; each of those steps can be turned off. Bot checks/CAPTCHAs, blank pages, timeouts, failed loads, and cache hits are not billed, and response headers identify the page verdict and billing status. Its MCP server gives AI agents tools named take_screenshot, get_page_info, and capture_pdf. The Free plan includes 1,000 screenshots a month with no card; paid plans start at $5 for 3,000 shots, and every feature is on every plan. Sign up for ScreenshotNeo free to get 1,000 screenshots a month with no card.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Frequently Asked Questions

Does a successful Firefox run prove PhantomJS is the cause?

No. It narrows the comparison, but the minimal cross-browser test and process/log checks are needed to locate the failing layer.

Should I increase the timeout first?

Not as the first fix. Identify the wait condition and use a bounded explicit wait so a condition that never occurs produces an observable failure.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.