0

I need to run selenium tests without showing browser. On ubuntu it's working perfectly as I expect. But on mac OS (version 10.11): Xvfb is not hiding the browser.

I start Xvfb in one terminal:

$ sudo Xvfb :1338
Password:
Initializing built-in extension Generic Event Extension
Initializing built-in extension SHAPE
Initializing built-in extension MIT-SHM
Initializing built-in extension XInputExtension
Initializing built-in extension XTEST
Initializing built-in extension BIG-REQUESTS
Initializing built-in extension SYNC
Initializing built-in extension XKEYBOARD
Initializing built-in extension XC-MISC
Initializing built-in extension XINERAMA
Initializing built-in extension XFIXES
Initializing built-in extension RENDER
Initializing built-in extension RANDR
Initializing built-in extension COMPOSITE
Initializing built-in extension DAMAGE
Initializing built-in extension MIT-SCREEN-SAVER
Initializing built-in extension DOUBLE-BUFFER
Initializing built-in extension RECORD
Initializing built-in extension DPMS
Initializing built-in extension Present
Initializing built-in extension X-Resource
Initializing built-in extension XVideo
Initializing built-in extension XVideo-MotionCompensation
[dix] Could not init font path element /System/Library/Fonts, removing from list!

In the second terminal I run selenium standalone server (having chromedriver in working directory) with DISPLAY env var:

$ DISPLAY=:1338 /Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/bin/java -jar ~/selenium-server-standalone-3.4.0.jar
19:27:25.021 INFO - Selenium build info: version: '3.4.0', revision: 'unknown'
19:27:25.022 INFO - Launching a standalone Selenium Server
2017-05-26 19:27:25.056:INFO::main: Logging initialized @311ms to org.seleniumhq.jetty9.util.log.StdErrLog
19:27:25.165 INFO - Driver provider org.openqa.selenium.ie.InternetExplorerDriver registration is skipped:
 registration capabilities Capabilities [{ensureCleanSession=true, browserName=internet explorer, version=, platform=WINDOWS}] does not match the current platform MAC
19:27:25.166 INFO - Driver provider org.openqa.selenium.edge.EdgeDriver registration is skipped:
 registration capabilities Capabilities [{browserName=MicrosoftEdge, version=, platform=WINDOWS}] does not match the current platform MAC
19:27:25.166 INFO - Driver class not found: com.opera.core.systems.OperaDriver
19:27:25.166 INFO - Driver provider com.opera.core.systems.OperaDriver registration is skipped:
Unable to create new instances on this machine.
19:27:25.166 INFO - Driver class not found: com.opera.core.systems.OperaDriver
19:27:25.167 INFO - Driver provider com.opera.core.systems.OperaDriver is not registered
2017-05-26 19:27:25.247:INFO:osjs.Server:main: jetty-9.4.3.v20170317
2017-05-26 19:27:25.304:INFO:osjsh.ContextHandler:main: Started o.s.j.s.ServletContextHandler@68be2bc2{/,null,AVAILABLE}
2017-05-26 19:27:25.343:INFO:osjs.AbstractConnector:main: Started ServerConnector@42d80b78{HTTP/1.1,[http/1.1]}{0.0.0.0:4444}
2017-05-26 19:27:25.344:INFO:osjs.Server:main: Started @600ms
19:27:25.344 INFO - Selenium Server is up and running

Then in the third terminal, I run Selenium test:

go run chrome.go

With content:

// Run some code on play.golang.org and display the result
package main

import (
    "fmt"
    "time"

    "github.com/tebeka/selenium"
)

var code = `
package main
import "fmt"

func main() {
    fmt.Println("Hello WebDriver!\n")
}
`

// Errors are ignored for brevity.

func main() {
    // FireFox driver without specific version
    // *** Add gecko driver here if necessary (see notes above.) ***
    caps := selenium.Capabilities{
        "browserName": "chrome",
    }
    wd, err := selenium.NewRemote(caps, "")
    if err != nil {
        panic(err)
        return
    }
    defer wd.Quit()

    // Get simple playground interface
    wd.Get("http://play.golang.org/?simple=1")

    // Enter code in textarea
    elem, _ := wd.FindElement(selenium.ByCSSSelector, "#code")
    elem.Clear()
    elem.SendKeys(code)

    // Click the run button
    btn, _ := wd.FindElement(selenium.ByCSSSelector, "#run")
    btn.Click()

    // Get the result
    div, _ := wd.FindElement(selenium.ByCSSSelector, "#output")

    output := ""
    // Wait for run to finish
    for {
        output, _ = div.Text()
        if output != "Waiting for remote server..." {
            break
        }
        time.Sleep(time.Millisecond * 100)
    }

    fmt.Printf("Got: %s\n", output)
}

And have output:

Got: Hello WebDriver!


Program exited.

I expect to not see the browser working. But I see the browser. Reading this and this didn't help me.

Maxim Yefremov
  • 13,671
  • 27
  • 117
  • 166

1 Answers1

1

You likely aren't using an X11-based version of a web browser. The native browsers on OSX don't use X11 and thus don't use $DISPLAY and can't run inside xvfb.

Bryan Oakley
  • 370,779
  • 53
  • 539
  • 685
  • any possible solutions/alternative to xvfb? Thanks – li.SQ Nov 28 '20 at 00:36
  • @li.SQ: firefox and chrome can both be used in headless mode if that's what you're asking. – Bryan Oakley Nov 28 '20 at 00:43
  • came here from [this issue](https://stackoverflow.com/questions/45370018/selenium-working-with-chrome-but-not-headless-chrome). – li.SQ Nov 28 '20 at 00:44
  • @li.SQ: headless browser support is much better now than it was back in 2017. – Bryan Oakley Nov 28 '20 at 00:46
  • I have the same issue as the linked post. Headless mode will seemingly hide the chrome browser but will not actually be able to visit webpages. Tried xvfb as per the top solution, though it still doesn't work, thus commenting on this 3 year old post. – li.SQ Nov 28 '20 at 00:50
  • @li.SQ maybe the site you are trying to test has protections against visiting with a headless browser – Bryan Oakley Nov 28 '20 at 02:17