kopia lustrzana https://github.com/browsh-org/browsh
Various improvements to integration tests
This has been a long time coming, but it's still not perfect. Basically I'm trying to reset the entire environment as much as possible so that each spec runs in a clean room. Mostly in this commit Firefox is being killed and restarted for every spec, which has made a lot of improvements.pull/263/head
rodzic
8ab587d5a6
commit
27826b34e2
|
@ -5,7 +5,7 @@ go:
|
||||||
|
|
||||||
addons:
|
addons:
|
||||||
# Use the full version number with ".0" if needed. This value is scraped by setup scripts.
|
# Use the full version number with ".0" if needed. This value is scraped by setup scripts.
|
||||||
firefox: "66.0.4"
|
firefox: "67.0.1"
|
||||||
apt:
|
apt:
|
||||||
packages:
|
packages:
|
||||||
- rpm
|
- rpm
|
||||||
|
@ -37,8 +37,8 @@ install:
|
||||||
script:
|
script:
|
||||||
- cd $REPO_ROOT/webext && npm test
|
- cd $REPO_ROOT/webext && npm test
|
||||||
- cd $REPO_ROOT/interfacer && go test $(find src/browsh -name *.go | grep -v windows)
|
- cd $REPO_ROOT/interfacer && go test $(find src/browsh -name *.go | grep -v windows)
|
||||||
- cd $REPO_ROOT/interfacer && go test test/tty/*.go -v -ginkgo.flakeAttempts=3
|
- cd $REPO_ROOT/interfacer && go test test/tty/*.go -v -ginkgo.slowSpecThreshold=30 -ginkgo.flakeAttempts=3
|
||||||
- cd $REPO_ROOT/interfacer && go test test/http-server/*.go -v
|
- cd $REPO_ROOT/interfacer && go test test/http-server/*.go -v -ginkgo.slowSpecThreshold=30 -ginkgo.flakeAttempts=3
|
||||||
after_failure:
|
after_failure:
|
||||||
- cat $REPO_ROOT/interfacer/test/tty/debug.log
|
- cat $REPO_ROOT/interfacer/test/tty/debug.log
|
||||||
- cat $REPO_ROOT/interfacer/test/http-server/debug.log
|
- cat $REPO_ROOT/interfacer/test/http-server/debug.log
|
||||||
|
|
|
@ -23,7 +23,7 @@ import (
|
||||||
|
|
||||||
var (
|
var (
|
||||||
logo = `
|
logo = `
|
||||||
//// ////
|
//// ////
|
||||||
/ / / /
|
/ / / /
|
||||||
// //
|
// //
|
||||||
// // ,,,,,,,,
|
// // ,,,,,,,,
|
||||||
|
@ -138,9 +138,9 @@ func Shell(command string) string {
|
||||||
parts = parts[1:]
|
parts = parts[1:]
|
||||||
out, err := exec.Command(head, parts...).CombinedOutput()
|
out, err := exec.Command(head, parts...).CombinedOutput()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
Log(fmt.Sprintf(
|
errorMessge := fmt.Sprintf(
|
||||||
"Browsh tried to run `%s` but failed with: %s", command, string(out)))
|
"Browsh tried to run `%s` but failed with: %s", command, string(out))
|
||||||
Shutdown(err)
|
Shutdown(errors.New(errorMessge))
|
||||||
}
|
}
|
||||||
return strings.TrimSpace(string(out))
|
return strings.TrimSpace(string(out))
|
||||||
}
|
}
|
||||||
|
@ -151,7 +151,7 @@ func TTYStart(injectedScreen tcell.Screen) {
|
||||||
setupTcell()
|
setupTcell()
|
||||||
writeString(1, 0, logo, tcell.StyleDefault)
|
writeString(1, 0, logo, tcell.StyleDefault)
|
||||||
writeString(0, 15, "Starting Browsh v"+browshVersion+", the modern text-based web browser.", tcell.StyleDefault)
|
writeString(0, 15, "Starting Browsh v"+browshVersion+", the modern text-based web browser.", tcell.StyleDefault)
|
||||||
startFirefox()
|
StartFirefox()
|
||||||
Log("Starting Browsh CLI client")
|
Log("Starting Browsh CLI client")
|
||||||
go readStdin()
|
go readStdin()
|
||||||
startWebSocketServer()
|
startWebSocketServer()
|
||||||
|
|
|
@ -6,6 +6,7 @@ import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/go-errors/errors"
|
||||||
"github.com/gorilla/websocket"
|
"github.com/gorilla/websocket"
|
||||||
"github.com/spf13/viper"
|
"github.com/spf13/viper"
|
||||||
)
|
)
|
||||||
|
@ -17,7 +18,7 @@ var (
|
||||||
WriteBufferSize: 1024,
|
WriteBufferSize: 1024,
|
||||||
}
|
}
|
||||||
stdinChannel = make(chan string)
|
stdinChannel = make(chan string)
|
||||||
isConnectedToWebExtension = false
|
IsConnectedToWebExtension = false
|
||||||
)
|
)
|
||||||
|
|
||||||
type incomingRawText struct {
|
type incomingRawText struct {
|
||||||
|
@ -29,13 +30,14 @@ func startWebSocketServer() {
|
||||||
serverMux := http.NewServeMux()
|
serverMux := http.NewServeMux()
|
||||||
serverMux.HandleFunc("/", webSocketServer)
|
serverMux.HandleFunc("/", webSocketServer)
|
||||||
port := viper.GetString("browsh.websocket-port")
|
port := viper.GetString("browsh.websocket-port")
|
||||||
if err := http.ListenAndServe(":"+port, serverMux); err != nil {
|
Log("Starting websocket server...")
|
||||||
Shutdown(err)
|
if netErr := http.ListenAndServe(":"+port, serverMux); netErr != nil {
|
||||||
|
Shutdown(errors.New(fmt.Errorf("Error starting websocket server: %v", netErr)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func sendMessageToWebExtension(message string) {
|
func sendMessageToWebExtension(message string) {
|
||||||
if !isConnectedToWebExtension {
|
if !IsConnectedToWebExtension {
|
||||||
Log("Webextension not connected. Message not sent: " + message)
|
Log("Webextension not connected. Message not sent: " + message)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -55,6 +57,11 @@ func webSocketReader(ws *websocket.Conn) {
|
||||||
triggerSocketWriterClose()
|
triggerSocketWriterClose()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway) {
|
||||||
|
Log("Socket reader detected that the connection unexpectedly dissapeared")
|
||||||
|
triggerSocketWriterClose()
|
||||||
|
return
|
||||||
|
}
|
||||||
Shutdown(err)
|
Shutdown(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -125,9 +132,10 @@ func webSocketWriter(ws *websocket.Conn) {
|
||||||
if err := ws.WriteMessage(websocket.TextMessage, []byte(message)); err != nil {
|
if err := ws.WriteMessage(websocket.TextMessage, []byte(message)); err != nil {
|
||||||
if err == websocket.ErrCloseSent {
|
if err == websocket.ErrCloseSent {
|
||||||
Log("Socket writer detected that the browser closed the websocket")
|
Log("Socket writer detected that the browser closed the websocket")
|
||||||
return
|
} else {
|
||||||
|
Log("Socket writer detected unexpected closure of websocket")
|
||||||
}
|
}
|
||||||
Shutdown(err)
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -138,7 +146,7 @@ func webSocketServer(w http.ResponseWriter, r *http.Request) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
Shutdown(err)
|
Shutdown(err)
|
||||||
}
|
}
|
||||||
isConnectedToWebExtension = true
|
IsConnectedToWebExtension = true
|
||||||
go webSocketWriter(ws)
|
go webSocketWriter(ws)
|
||||||
go webSocketReader(ws)
|
go webSocketReader(ws)
|
||||||
sendConfigToWebExtension()
|
sendConfigToWebExtension()
|
||||||
|
|
|
@ -52,8 +52,8 @@ var (
|
||||||
)
|
)
|
||||||
|
|
||||||
func startHeadlessFirefox() {
|
func startHeadlessFirefox() {
|
||||||
checkIfFirefoxIsAlreadyRunning()
|
|
||||||
Log("Starting Firefox in headless mode")
|
Log("Starting Firefox in headless mode")
|
||||||
|
checkIfFirefoxIsAlreadyRunning()
|
||||||
firefoxPath := ensureFirefoxBinary()
|
firefoxPath := ensureFirefoxBinary()
|
||||||
ensureFirefoxVersion(firefoxPath)
|
ensureFirefoxVersion(firefoxPath)
|
||||||
args := []string{"--marionette"}
|
args := []string{"--marionette"}
|
||||||
|
@ -149,6 +149,10 @@ func versionOrdinal(version string) string {
|
||||||
// extension.
|
// extension.
|
||||||
func startWERFirefox() {
|
func startWERFirefox() {
|
||||||
Log("Attempting to start headless Firefox with `web-ext`")
|
Log("Attempting to start headless Firefox with `web-ext`")
|
||||||
|
if IsConnectedToWebExtension {
|
||||||
|
Shutdown(errors.New("There appears to already be an existing Web Extension connection"))
|
||||||
|
}
|
||||||
|
checkIfFirefoxIsAlreadyRunning()
|
||||||
var rootDir = Shell("git rev-parse --show-toplevel")
|
var rootDir = Shell("git rev-parse --show-toplevel")
|
||||||
args := []string{
|
args := []string{
|
||||||
"run",
|
"run",
|
||||||
|
@ -158,7 +162,6 @@ func startWERFirefox() {
|
||||||
}
|
}
|
||||||
firefoxProcess := exec.Command(rootDir+"/webext/node_modules/.bin/web-ext", args...)
|
firefoxProcess := exec.Command(rootDir+"/webext/node_modules/.bin/web-ext", args...)
|
||||||
firefoxProcess.Dir = rootDir + "/webext/dist/"
|
firefoxProcess.Dir = rootDir + "/webext/dist/"
|
||||||
defer firefoxProcess.Process.Kill()
|
|
||||||
stdout, err := firefoxProcess.StdoutPipe()
|
stdout, err := firefoxProcess.StdoutPipe()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
Shutdown(err)
|
Shutdown(err)
|
||||||
|
@ -168,6 +171,8 @@ func startWERFirefox() {
|
||||||
}
|
}
|
||||||
in := bufio.NewScanner(stdout)
|
in := bufio.NewScanner(stdout)
|
||||||
for in.Scan() {
|
for in.Scan() {
|
||||||
|
if strings.Contains(in.Text(), "Connected to the remote Firefox debugger") {
|
||||||
|
}
|
||||||
if strings.Contains(in.Text(), "JavaScript strict") ||
|
if strings.Contains(in.Text(), "JavaScript strict") ||
|
||||||
strings.Contains(in.Text(), "D-BUS") ||
|
strings.Contains(in.Text(), "D-BUS") ||
|
||||||
strings.Contains(in.Text(), "dbus") {
|
strings.Contains(in.Text(), "dbus") {
|
||||||
|
@ -175,6 +180,7 @@ func startWERFirefox() {
|
||||||
}
|
}
|
||||||
Log("FF-CONSOLE: " + in.Text())
|
Log("FF-CONSOLE: " + in.Text())
|
||||||
}
|
}
|
||||||
|
Log("WER Firefox unexpectedly closed")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Connect to Firefox's Marionette service.
|
// Connect to Firefox's Marionette service.
|
||||||
|
@ -294,7 +300,7 @@ func setupFirefox() {
|
||||||
installWebextension()
|
installWebextension()
|
||||||
}
|
}
|
||||||
|
|
||||||
func startFirefox() {
|
func StartFirefox() {
|
||||||
if !viper.GetBool("firefox.use-existing") {
|
if !viper.GetBool("firefox.use-existing") {
|
||||||
writeString(0, 16, "Waiting for Firefox to connect...", tcell.StyleDefault)
|
writeString(0, 16, "Waiting for Firefox to connect...", tcell.StyleDefault)
|
||||||
if IsTesting {
|
if IsTesting {
|
||||||
|
|
|
@ -66,7 +66,7 @@ type rawTextResponse struct {
|
||||||
// it will return:
|
// it will return:
|
||||||
// `Something `
|
// `Something `
|
||||||
func HTTPServerStart() {
|
func HTTPServerStart() {
|
||||||
startFirefox()
|
StartFirefox()
|
||||||
go startWebSocketServer()
|
go startWebSocketServer()
|
||||||
Log("Starting Browsh HTTP server")
|
Log("Starting Browsh HTTP server")
|
||||||
bind := viper.GetString("http-server.bind")
|
bind := viper.GetString("http-server.bind")
|
||||||
|
|
|
@ -29,6 +29,13 @@ type tab struct {
|
||||||
frame frame
|
frame frame
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ResetTabs() {
|
||||||
|
Tabs = make(map[int]*tab)
|
||||||
|
CurrentTab = nil
|
||||||
|
tabsOrder = nil
|
||||||
|
tabsDeleted = nil
|
||||||
|
}
|
||||||
|
|
||||||
func ensureTabExists(id int) {
|
func ensureTabExists(id int) {
|
||||||
if _, ok := Tabs[id]; !ok {
|
if _, ok := Tabs[id]; !ok {
|
||||||
newTab(id)
|
newTab(id)
|
||||||
|
|
|
@ -37,7 +37,7 @@ func writeString(x, y int, str string, style tcell.Style) {
|
||||||
x = xOriginal
|
x = xOriginal
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
screen.SetContent(x, y, c, nil, style)
|
screen.SetCell(x, y, style, c)
|
||||||
x++
|
x++
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,11 +21,21 @@ func startStaticFileServer() {
|
||||||
http.ListenAndServe(":"+staticFileServerPort, serverMux)
|
http.ListenAndServe(":"+staticFileServerPort, serverMux)
|
||||||
}
|
}
|
||||||
|
|
||||||
func startBrowsh() {
|
func initBrowsh() {
|
||||||
browsh.IsTesting = true
|
browsh.IsTesting = true
|
||||||
browsh.Initialise()
|
browsh.Initialise()
|
||||||
viper.Set("http-server-mode", true)
|
viper.Set("http-server-mode", true)
|
||||||
browsh.HTTPServerStart()
|
}
|
||||||
|
|
||||||
|
func waitUntilConnectedToWebExtension(maxTime time.Duration) {
|
||||||
|
start := time.Now()
|
||||||
|
for time.Since(start) < maxTime {
|
||||||
|
if browsh.IsConnectedToWebExtension {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
time.Sleep(50 * time.Millisecond)
|
||||||
|
}
|
||||||
|
panic("Didn't connect to webextension in time")
|
||||||
}
|
}
|
||||||
|
|
||||||
func getBrowshServiceBase() string {
|
func getBrowshServiceBase() string {
|
||||||
|
@ -55,7 +65,17 @@ func getPath(path string, mode string) string {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func stopFirefox() {
|
||||||
|
browsh.IsConnectedToWebExtension = false
|
||||||
|
browsh.Shell(rootDir + "/webext/contrib/firefoxheadless.sh kill")
|
||||||
|
time.Sleep(500 * time.Millisecond)
|
||||||
|
}
|
||||||
|
|
||||||
var _ = ginkgo.BeforeEach(func() {
|
var _ = ginkgo.BeforeEach(func() {
|
||||||
|
stopFirefox()
|
||||||
|
browsh.ResetTabs()
|
||||||
|
browsh.StartFirefox()
|
||||||
|
waitUntilConnectedToWebExtension(15 * time.Second)
|
||||||
browsh.IsMonochromeMode = false
|
browsh.IsMonochromeMode = false
|
||||||
browsh.Log("\n---------")
|
browsh.Log("\n---------")
|
||||||
browsh.Log(ginkgo.CurrentGinkgoTestDescription().FullTestText)
|
browsh.Log(ginkgo.CurrentGinkgoTestDescription().FullTestText)
|
||||||
|
@ -63,14 +83,13 @@ var _ = ginkgo.BeforeEach(func() {
|
||||||
})
|
})
|
||||||
|
|
||||||
var _ = ginkgo.BeforeSuite(func() {
|
var _ = ginkgo.BeforeSuite(func() {
|
||||||
|
initBrowsh()
|
||||||
|
stopFirefox()
|
||||||
go startStaticFileServer()
|
go startStaticFileServer()
|
||||||
go startBrowsh()
|
go browsh.HTTPServerStart()
|
||||||
time.Sleep(15 * time.Second)
|
time.Sleep(1 * time.Second)
|
||||||
// Allow the browser to sort its sizing out, because sometimes the first test catches the
|
|
||||||
// browser before it's completed its resizing.
|
|
||||||
getPath("/smorgasbord", "plain")
|
|
||||||
})
|
})
|
||||||
|
|
||||||
var _ = ginkgo.AfterSuite(func() {
|
var _ = ginkgo.AfterSuite(func() {
|
||||||
browsh.Shell(rootDir + "/webext/contrib/firefoxheadless.sh kill")
|
stopFirefox()
|
||||||
})
|
})
|
||||||
|
|
|
@ -1,7 +1,10 @@
|
||||||
package test
|
package test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
"unicode/utf8"
|
"unicode/utf8"
|
||||||
|
@ -22,6 +25,8 @@ var perTestTimeout = 2000 * time.Millisecond
|
||||||
var rootDir = browsh.Shell("git rev-parse --show-toplevel")
|
var rootDir = browsh.Shell("git rev-parse --show-toplevel")
|
||||||
var testSiteURL = "http://localhost:" + staticFileServerPort
|
var testSiteURL = "http://localhost:" + staticFileServerPort
|
||||||
var ti *terminfo.Terminfo
|
var ti *terminfo.Terminfo
|
||||||
|
var dir, _ = os.Getwd()
|
||||||
|
var framesLogFile = fmt.Sprintf(filepath.Join(dir, "frames.log"))
|
||||||
|
|
||||||
func initTerm() {
|
func initTerm() {
|
||||||
// The tests check for true colour RGB values. The only downside to forcing true colour
|
// The tests check for true colour RGB values. The only downside to forcing true colour
|
||||||
|
@ -48,11 +53,25 @@ func GetFrame() string {
|
||||||
line = 0
|
line = 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
writeFrameLog("================================================")
|
||||||
|
writeFrameLog(ginkgo.CurrentGinkgoTestDescription().FullTestText)
|
||||||
|
writeFrameLog("================================================\n")
|
||||||
log = "\n" + log + styleDefault
|
log = "\n" + log + styleDefault
|
||||||
ginkgo.GinkgoWriter.Write([]byte(log))
|
writeFrameLog(log)
|
||||||
return frame
|
return frame
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func writeFrameLog(log string) {
|
||||||
|
f, err := os.OpenFile(framesLogFile, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0600)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
if _, err = f.WriteString(log); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Trigger the key definition specified by name
|
// Trigger the key definition specified by name
|
||||||
func triggerUserKeyFor(name string) {
|
func triggerUserKeyFor(name string) {
|
||||||
key := viper.GetStringSlice(name)
|
key := viper.GetStringSlice(name)
|
||||||
|
@ -110,7 +129,7 @@ func WaitForPageLoad() {
|
||||||
|
|
||||||
func sleepUntilPageLoad(maxTime time.Duration) {
|
func sleepUntilPageLoad(maxTime time.Duration) {
|
||||||
start := time.Now()
|
start := time.Now()
|
||||||
time.Sleep(50 * time.Millisecond)
|
time.Sleep(1000 * time.Millisecond)
|
||||||
for time.Since(start) < maxTime {
|
for time.Since(start) < maxTime {
|
||||||
if browsh.CurrentTab != nil {
|
if browsh.CurrentTab != nil {
|
||||||
if browsh.CurrentTab.PageState == "parsing_complete" {
|
if browsh.CurrentTab.PageState == "parsing_complete" {
|
||||||
|
@ -132,6 +151,12 @@ func GotoURL(url string) {
|
||||||
// TODO: Looking for the URL isn't optimal because it could be the same URL
|
// TODO: Looking for the URL isn't optimal because it could be the same URL
|
||||||
// as the previous test.
|
// as the previous test.
|
||||||
gomega.Expect(url).To(BeInFrameAt(0, 1))
|
gomega.Expect(url).To(BeInFrameAt(0, 1))
|
||||||
|
// TODO: hack to work around bug where text sometimes doesn't render on page load.
|
||||||
|
// Clicking with the mouse triggers a reparse by the web extension
|
||||||
|
mouseClick(3, 6)
|
||||||
|
time.Sleep(100 * time.Millisecond)
|
||||||
|
mouseClick(3, 6)
|
||||||
|
time.Sleep(500 * time.Millisecond)
|
||||||
}
|
}
|
||||||
|
|
||||||
func mouseClick(x, y int) {
|
func mouseClick(x, y int) {
|
||||||
|
@ -199,11 +224,18 @@ func startStaticFileServer() {
|
||||||
http.ListenAndServe(":"+staticFileServerPort, serverMux)
|
http.ListenAndServe(":"+staticFileServerPort, serverMux)
|
||||||
}
|
}
|
||||||
|
|
||||||
func startBrowsh() {
|
func initBrowsh() {
|
||||||
browsh.IsTesting = true
|
browsh.IsTesting = true
|
||||||
simScreen = tcell.NewSimulationScreen("UTF-8")
|
simScreen = tcell.NewSimulationScreen("UTF-8")
|
||||||
browsh.Initialise()
|
browsh.Initialise()
|
||||||
browsh.TTYStart(simScreen)
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func stopFirefox() {
|
||||||
|
browsh.Log("Attempting to kill all firefox processes")
|
||||||
|
browsh.IsConnectedToWebExtension = false
|
||||||
|
browsh.Shell(rootDir + "/webext/contrib/firefoxheadless.sh kill")
|
||||||
|
time.Sleep(500 * time.Millisecond)
|
||||||
}
|
}
|
||||||
|
|
||||||
func runeCount(text string) int {
|
func runeCount(text string) int {
|
||||||
|
@ -211,6 +243,11 @@ func runeCount(text string) int {
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ = ginkgo.BeforeEach(func() {
|
var _ = ginkgo.BeforeEach(func() {
|
||||||
|
browsh.Log("Attempting to restart WER Firefox...")
|
||||||
|
stopFirefox()
|
||||||
|
browsh.ResetTabs()
|
||||||
|
browsh.StartFirefox()
|
||||||
|
sleepUntilPageLoad(startupWait)
|
||||||
browsh.IsMonochromeMode = false
|
browsh.IsMonochromeMode = false
|
||||||
browsh.Log("\n---------")
|
browsh.Log("\n---------")
|
||||||
browsh.Log(ginkgo.CurrentGinkgoTestDescription().FullTestText)
|
browsh.Log(ginkgo.CurrentGinkgoTestDescription().FullTestText)
|
||||||
|
@ -218,12 +255,18 @@ var _ = ginkgo.BeforeEach(func() {
|
||||||
})
|
})
|
||||||
|
|
||||||
var _ = ginkgo.BeforeSuite(func() {
|
var _ = ginkgo.BeforeSuite(func() {
|
||||||
|
os.Truncate(framesLogFile, 0)
|
||||||
initTerm()
|
initTerm()
|
||||||
|
initBrowsh()
|
||||||
|
stopFirefox()
|
||||||
go startStaticFileServer()
|
go startStaticFileServer()
|
||||||
go startBrowsh()
|
go browsh.TTYStart(simScreen)
|
||||||
sleepUntilPageLoad(startupWait)
|
// Firefox seems to take longer to die after its first run
|
||||||
|
time.Sleep(500 * time.Millisecond)
|
||||||
|
stopFirefox()
|
||||||
|
time.Sleep(5000 * time.Millisecond)
|
||||||
})
|
})
|
||||||
|
|
||||||
var _ = ginkgo.AfterSuite(func() {
|
var _ = ginkgo.AfterSuite(func() {
|
||||||
browsh.Shell(rootDir + "/webext/contrib/firefoxheadless.sh kill")
|
stopFirefox()
|
||||||
})
|
})
|
||||||
|
|
|
@ -1,7 +1,13 @@
|
||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
if [[ "$1" = "kill" ]]; then
|
if [[ "$1" = "kill" ]]; then
|
||||||
kill $(ps aux|grep headless|grep 'profile /tmp'| tr -s ' ' | cut -d ' ' -f2)
|
pids=$(ps aux|grep headless|grep 'profile /tmp'| tr -s ' ' | cut -d ' ' -f2)
|
||||||
|
if [[ $pids =~ [^0-9] ]] ; then
|
||||||
|
kill $pids
|
||||||
|
fi
|
||||||
|
if [[ "$CI" == "true" ]]; then
|
||||||
|
pkill -9 firefox || true
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
FIREFOX_BIN=${FIREFOX:-firefox}
|
FIREFOX_BIN=${FIREFOX:-firefox}
|
||||||
$FIREFOX_BIN --headless "$@"
|
$FIREFOX_BIN --headless "$@"
|
||||||
|
|
|
@ -4591,7 +4591,8 @@
|
||||||
"ansi-regex": {
|
"ansi-regex": {
|
||||||
"version": "2.1.1",
|
"version": "2.1.1",
|
||||||
"bundled": true,
|
"bundled": true,
|
||||||
"dev": true
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
},
|
},
|
||||||
"aproba": {
|
"aproba": {
|
||||||
"version": "1.2.0",
|
"version": "1.2.0",
|
||||||
|
@ -4612,12 +4613,14 @@
|
||||||
"balanced-match": {
|
"balanced-match": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"bundled": true,
|
"bundled": true,
|
||||||
"dev": true
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
},
|
},
|
||||||
"brace-expansion": {
|
"brace-expansion": {
|
||||||
"version": "1.1.11",
|
"version": "1.1.11",
|
||||||
"bundled": true,
|
"bundled": true,
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"balanced-match": "^1.0.0",
|
"balanced-match": "^1.0.0",
|
||||||
"concat-map": "0.0.1"
|
"concat-map": "0.0.1"
|
||||||
|
@ -4632,17 +4635,20 @@
|
||||||
"code-point-at": {
|
"code-point-at": {
|
||||||
"version": "1.1.0",
|
"version": "1.1.0",
|
||||||
"bundled": true,
|
"bundled": true,
|
||||||
"dev": true
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
},
|
},
|
||||||
"concat-map": {
|
"concat-map": {
|
||||||
"version": "0.0.1",
|
"version": "0.0.1",
|
||||||
"bundled": true,
|
"bundled": true,
|
||||||
"dev": true
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
},
|
},
|
||||||
"console-control-strings": {
|
"console-control-strings": {
|
||||||
"version": "1.1.0",
|
"version": "1.1.0",
|
||||||
"bundled": true,
|
"bundled": true,
|
||||||
"dev": true
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
},
|
},
|
||||||
"core-util-is": {
|
"core-util-is": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
|
@ -4759,7 +4765,8 @@
|
||||||
"inherits": {
|
"inherits": {
|
||||||
"version": "2.0.3",
|
"version": "2.0.3",
|
||||||
"bundled": true,
|
"bundled": true,
|
||||||
"dev": true
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
},
|
},
|
||||||
"ini": {
|
"ini": {
|
||||||
"version": "1.3.5",
|
"version": "1.3.5",
|
||||||
|
@ -4771,6 +4778,7 @@
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"bundled": true,
|
"bundled": true,
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"number-is-nan": "^1.0.0"
|
"number-is-nan": "^1.0.0"
|
||||||
}
|
}
|
||||||
|
@ -4785,6 +4793,7 @@
|
||||||
"version": "3.0.4",
|
"version": "3.0.4",
|
||||||
"bundled": true,
|
"bundled": true,
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"brace-expansion": "^1.1.7"
|
"brace-expansion": "^1.1.7"
|
||||||
}
|
}
|
||||||
|
@ -4792,12 +4801,14 @@
|
||||||
"minimist": {
|
"minimist": {
|
||||||
"version": "0.0.8",
|
"version": "0.0.8",
|
||||||
"bundled": true,
|
"bundled": true,
|
||||||
"dev": true
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
},
|
},
|
||||||
"minipass": {
|
"minipass": {
|
||||||
"version": "2.2.4",
|
"version": "2.2.4",
|
||||||
"bundled": true,
|
"bundled": true,
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"safe-buffer": "^5.1.1",
|
"safe-buffer": "^5.1.1",
|
||||||
"yallist": "^3.0.0"
|
"yallist": "^3.0.0"
|
||||||
|
@ -4816,6 +4827,7 @@
|
||||||
"version": "0.5.1",
|
"version": "0.5.1",
|
||||||
"bundled": true,
|
"bundled": true,
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"minimist": "0.0.8"
|
"minimist": "0.0.8"
|
||||||
}
|
}
|
||||||
|
@ -4896,7 +4908,8 @@
|
||||||
"number-is-nan": {
|
"number-is-nan": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"bundled": true,
|
"bundled": true,
|
||||||
"dev": true
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
},
|
},
|
||||||
"object-assign": {
|
"object-assign": {
|
||||||
"version": "4.1.1",
|
"version": "4.1.1",
|
||||||
|
@ -4908,6 +4921,7 @@
|
||||||
"version": "1.4.0",
|
"version": "1.4.0",
|
||||||
"bundled": true,
|
"bundled": true,
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"wrappy": "1"
|
"wrappy": "1"
|
||||||
}
|
}
|
||||||
|
@ -4993,7 +5007,8 @@
|
||||||
"safe-buffer": {
|
"safe-buffer": {
|
||||||
"version": "5.1.1",
|
"version": "5.1.1",
|
||||||
"bundled": true,
|
"bundled": true,
|
||||||
"dev": true
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
},
|
},
|
||||||
"safer-buffer": {
|
"safer-buffer": {
|
||||||
"version": "2.1.2",
|
"version": "2.1.2",
|
||||||
|
@ -5029,6 +5044,7 @@
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"bundled": true,
|
"bundled": true,
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"code-point-at": "^1.0.0",
|
"code-point-at": "^1.0.0",
|
||||||
"is-fullwidth-code-point": "^1.0.0",
|
"is-fullwidth-code-point": "^1.0.0",
|
||||||
|
@ -5048,6 +5064,7 @@
|
||||||
"version": "3.0.1",
|
"version": "3.0.1",
|
||||||
"bundled": true,
|
"bundled": true,
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"ansi-regex": "^2.0.0"
|
"ansi-regex": "^2.0.0"
|
||||||
}
|
}
|
||||||
|
@ -5091,12 +5108,14 @@
|
||||||
"wrappy": {
|
"wrappy": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"bundled": true,
|
"bundled": true,
|
||||||
"dev": true
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
},
|
},
|
||||||
"yallist": {
|
"yallist": {
|
||||||
"version": "3.0.2",
|
"version": "3.0.2",
|
||||||
"bundled": true,
|
"bundled": true,
|
||||||
"dev": true
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -150,6 +150,12 @@ export default MixinBase =>
|
||||||
|
|
||||||
_triggerKeyPress(key) {
|
_triggerKeyPress(key) {
|
||||||
let el = document.activeElement;
|
let el = document.activeElement;
|
||||||
|
if (el == null) {
|
||||||
|
this.log(
|
||||||
|
`Not pressing '${key.char}(${key.key})' as there is no active element`
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
const key_object = {
|
const key_object = {
|
||||||
key: key.char,
|
key: key.char,
|
||||||
keyCode: key.key
|
keyCode: key.key
|
||||||
|
|
Ładowanie…
Reference in New Issue