1
0
mirror of https://github.com/MontFerret/ferret.git synced 2025-02-09 13:38:35 +02:00

Migration to lab (#526)

* Switched to Lab for e2e tests

* Switched to binary

* Updated lab installation

* Updated use of Lab installer

* updates

* Changed lab installation path

* Updated use of installer

* Works

* Added additional functions

* Updated some tests

* Updated go.sum

* Works

* Refactored assertions

* Added tests for testing.True

* Added tests for testing.None

* Added tests for testing.Lte

* Added tests for testing.Lt

* Added generic consturctor

* Added tests for testing.Len

* Added tests for testing.Gte

* Added tests for testing.Gt

* Added tests for testing.False

* Added tests for testing.Empty

* Added tests for testing.Fail

* Added tests for testing.Equal

* Added tests for testing.Include

* Updated urls in static page tests

* Fixed namespace unit tests

* Fixed unit test for testing.Len

* Updated E2E scripts

* Updaes

* Updated Chrome in CI/CD

* Added e2e for example test click.fql

* Added suite cases for example scripts

* Updated examples

* Updated

* Added type assertions

* Updated Chrome opts and disabled headers and cookies related tests

* Fixed iframes example

* Increased timeouts in navigation examples

* Updated value example

* Updated comments

* Disabled cookies examples

* Fixed static url

* Disabled headers examples

* Disabled UA test

* Simplified wait logic

* Added base testing module

* Fixes after codereview

* Disabled failing tests
This commit is contained in:
Tim Voronov 2020-06-17 17:37:01 -04:00 committed by GitHub
parent ad24814efd
commit 2643321e0f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
219 changed files with 2953 additions and 1181 deletions

View File

@ -66,13 +66,15 @@ jobs:
- stage: e2e
go: stable
before_script:
- docker pull microbox/chromium-headless:77.0.3844.0
- docker run -d -p 9222:9222 microbox/chromium-headless:77.0.3844.0
- docker ps
- curl https://raw.githubusercontent.com/MontFerret/lab/master/install.sh -o install.sh
- sudo sh install.sh
- docker run -d -p 9222:9222 -e CHROME_OPTS='--disable-dev-shm-usage --full-memory-crash-report' alpeware/chrome-headless-stable:ver-83.0.4103.61
- docker ps
script:
- make e2e
- make compile
- make e2e
after_script:
- docker stop $(docker ps -q)
- docker stop $(docker ps -q)
- stage: bench
go: stable
script:

View File

@ -30,8 +30,7 @@ cover:
curl -s https://codecov.io/bash | bash
e2e:
go run ${DIR_E2E}/main.go --tests ${DIR_E2E}/tests --pages ${DIR_E2E}/pages
# --filter=e2e/tests/dynamic/element/inner_text/get_by_selector.fql
lab --timeout=120 --concurrency=2 --wait=http://127.0.0.1:9222/json/version --runtime=bin://./bin/ferret --files=file://./e2e/tests --dir=./e2e/pages/dynamic:8080@dynamic --dir=./e2e/pages/static:8081@static
bench:
go test -run=XXX -bench=. ${DIR_PKG}/...

View File

@ -1,136 +0,0 @@
package main
import (
"context"
"flag"
"fmt"
"net"
"os"
"os/signal"
"path/filepath"
"github.com/MontFerret/ferret/e2e/runner"
"github.com/MontFerret/ferret/e2e/server"
"github.com/rs/zerolog"
)
var (
testsDir = flag.String(
"tests",
"./tests",
"root directory with test scripts",
)
pagesDir = flag.String(
"pages",
"./pages",
"root directory with test pages",
)
cdp = flag.String(
"cdp",
"http://0.0.0.0:9222",
"address of remote Chrome instance",
)
filter = flag.String(
"filter",
"",
"regexp expression to filter out tests",
)
)
func getOutboundIP() (net.IP, error) {
conn, err := net.Dial("udp", "8.8.8.8:80")
if err != nil {
return nil, err
}
defer conn.Close()
localAddr := conn.LocalAddr().(*net.UDPAddr)
return localAddr.IP, nil
}
func main() {
flag.Parse()
logger := zerolog.New(zerolog.ConsoleWriter{Out: os.Stderr})
staticPort := uint64(8080)
static := server.New(server.Settings{
Port: staticPort,
Dir: filepath.Join(*pagesDir, "static"),
})
dynamicPort := uint64(8081)
dynamic := server.New(server.Settings{
Port: dynamicPort,
Dir: filepath.Join(*pagesDir, "dynamic"),
})
go func() {
if err := static.Start(); err != nil {
logger.Info().Timestamp().Msg("shutting down the static pages server")
}
}()
go func() {
if err := dynamic.Start(); err != nil {
logger.Info().Timestamp().Msg("shutting down the dynamic pages server")
}
}()
if *testsDir == "" {
_, err := filepath.Abs(filepath.Dir(os.Args[0]))
if err != nil {
logger.Fatal().Timestamp().Err(err).Msg("failed to get testsDir")
return
}
}
var ipAddr string
// we need it in those cases when a Chrome instance is running inside a container
// and it needs an external IP to get access to our static web server
outIP, err := getOutboundIP()
if err != nil {
ipAddr = "0.0.0.0"
logger.Warn().Err(err).Msg("Failed to get outbound IP address")
} else {
ipAddr = outIP.String()
}
r := runner.New(logger, runner.Settings{
StaticServerAddress: fmt.Sprintf("http://%s:%d", ipAddr, staticPort),
DynamicServerAddress: fmt.Sprintf("http://%s:%d", ipAddr, dynamicPort),
CDPAddress: *cdp,
Dir: *testsDir,
Filter: *filter,
})
ctx, cancel := context.WithCancel(context.Background())
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt)
go func() {
for {
<-c
cancel()
}
}()
err = r.Run(ctx)
if err != nil {
os.Exit(1)
}
os.Exit(0)
}

View File

@ -1,67 +0,0 @@
package runner
import (
"context"
"fmt"
"io/ioutil"
"net/http"
"github.com/MontFerret/ferret/pkg/runtime/core"
"github.com/MontFerret/ferret/pkg/runtime/values"
)
func HTTPHelpers(ns core.Namespace) error {
return ns.RegisterFunctions(
core.NewFunctionsFromMap(map[string]core.Function{
"GET": httpGet,
}),
)
}
func Assertions(ns core.Namespace) error {
return ns.RegisterFunctions(
core.NewFunctionsFromMap(map[string]core.Function{
"EXPECT": expect,
}),
)
}
func expect(_ context.Context, args ...core.Value) (core.Value, error) {
err := core.ValidateArgs(args, 2, 2)
if err != nil {
return values.None, err
}
if args[0].Compare(args[1]) == 0 {
return values.EmptyString, nil
}
return values.NewString(fmt.Sprintf(`expected "%s", but got "%s"`, args[0], args[1])), nil
}
func httpGet(_ context.Context, args ...core.Value) (core.Value, error) {
err := core.ValidateArgs(args, 1, 2)
if err != nil {
return values.None, err
}
url := args[0].String()
resp, err := http.Get(url)
if err != nil {
return values.None, err
}
defer resp.Body.Close()
b, err := ioutil.ReadAll(resp.Body)
if err != nil {
return values.None, err
}
return values.String(b), nil
}

View File

@ -1,412 +0,0 @@
package runner
import (
"context"
"encoding/json"
"io/ioutil"
"os"
"path/filepath"
"strings"
"time"
"github.com/MontFerret/ferret/pkg/compiler"
"github.com/MontFerret/ferret/pkg/drivers"
"github.com/MontFerret/ferret/pkg/drivers/cdp"
"github.com/MontFerret/ferret/pkg/drivers/http"
"github.com/MontFerret/ferret/pkg/runtime"
"github.com/gobwas/glob"
"github.com/pkg/errors"
"github.com/rs/zerolog"
)
type (
Settings struct {
StaticServerAddress string
DynamicServerAddress string
CDPAddress string
Dir string
Filter string
}
Result struct {
name string
duration time.Duration
err error
}
Summary struct {
passed int
failed int
duration time.Duration
}
Runner struct {
logger zerolog.Logger
settings Settings
}
)
func New(logger zerolog.Logger, settings Settings) *Runner {
return &Runner{
logger,
settings,
}
}
func (r *Runner) Run(ctx context.Context) error {
ctx = drivers.WithContext(
ctx,
cdp.NewDriver(cdp.WithAddress(r.settings.CDPAddress)),
)
ctx = drivers.WithContext(
ctx,
cdp.NewDriver(cdp.WithAddress(r.settings.CDPAddress),
cdp.WithCustomName("cdp_headers"),
cdp.WithHeader("Single_header", []string{"single_header_value"}),
cdp.WithHeaders(drivers.HTTPHeaders{
"Multi_set_header": []string{"multi_set_header_value"},
"Multi_set_header2": []string{"multi_set_header2_value"},
}),
),
)
ctx = drivers.WithContext(
ctx,
cdp.NewDriver(cdp.WithAddress(r.settings.CDPAddress),
cdp.WithCustomName("cdp_cookies"),
cdp.WithCookie(drivers.HTTPCookie{
Name: "single_cookie",
Value: "single_cookie_value",
Path: "/",
MaxAge: 0,
Secure: false,
HTTPOnly: false,
SameSite: 0,
}),
cdp.WithCookies([]drivers.HTTPCookie{
{
Name: "multi_set_cookie",
Value: "multi_set_cookie_value",
Path: "/",
MaxAge: 0,
Secure: false,
HTTPOnly: false,
SameSite: 0,
},
{
Name: "multi_set_cookie2",
Value: "multi_set_cookie2_value",
Path: "/",
MaxAge: 0,
Secure: false,
HTTPOnly: false,
SameSite: 0,
},
}),
),
)
ctx = drivers.WithContext(
ctx,
http.NewDriver(),
drivers.AsDefault(),
)
ctx = drivers.WithContext(
ctx,
http.NewDriver(
http.WithCustomName("http_headers"),
http.WithHeader("Single_header", []string{"single_header_value"}),
http.WithHeaders(drivers.HTTPHeaders{
"Multi_set_header": []string{"multi_set_header_value"},
"Multi_set_header2": []string{"multi_set_header2_value"},
}),
),
)
ctx = drivers.WithContext(
ctx,
http.NewDriver(
http.WithCustomName("http_cookies"),
http.WithCookie(drivers.HTTPCookie{
Name: "single_cookie",
Value: "single_cookie_value",
Path: "/",
MaxAge: 0,
Secure: false,
HTTPOnly: false,
SameSite: 0,
}),
http.WithCookies([]drivers.HTTPCookie{
{
Name: "multi_set_cookie",
Value: "multi_set_cookie_value",
Path: "/",
MaxAge: 0,
Secure: false,
HTTPOnly: false,
SameSite: 0,
},
{
Name: "multi_set_cookie2",
Value: "multi_set_cookie2_value",
Path: "/",
MaxAge: 0,
Secure: false,
HTTPOnly: false,
SameSite: 0,
},
}),
),
)
results, err := r.runQueries(ctx, r.settings.Dir)
if err != nil {
return err
}
sum := r.report(results)
var event *zerolog.Event
if sum.failed == 0 {
event = r.logger.Info()
} else {
event = r.logger.Error()
}
event.
Timestamp().
Int("passed", sum.passed).
Int("failed", sum.failed).
Str("duration", sum.duration.String()).
Msg("Completed")
if sum.failed > 0 {
return errors.New("failed")
}
return nil
}
func (r *Runner) runQueries(ctx context.Context, dir string) ([]Result, error) {
results := make([]Result, 0, 50)
c := compiler.New()
// backward compatible
if err := Assertions(c); err != nil {
return nil, err
}
ns := c.Namespace("T")
if err := Assertions(ns); err != nil {
return nil, err
}
if err := HTTPHelpers(ns.Namespace("HTTP")); err != nil {
return nil, err
}
var filter glob.Glob
var useFilter bool
if r.settings.Filter != "" {
f, err := glob.Compile(r.settings.Filter)
if err != nil {
return nil, err
}
filter = f
useFilter = true
}
err := r.traverseDir(ctx, dir, func(name string) error {
if useFilter {
if !filter.Match(name) {
return nil
}
}
b, err := ioutil.ReadFile(name)
if err != nil {
results = append(results, Result{
name: name,
err: errors.Wrap(err, "failed to read script file"),
})
return nil
}
r.logger.Info().Timestamp().Str("name", name).Msg("Running test")
select {
case <-ctx.Done():
return context.Canceled
default:
result := r.runQuery(ctx, c, name, string(b))
if result.err == nil {
r.logger.Info().
Timestamp().
Str("file", result.name).
Str("duration", result.duration.String()).
Msg("Test passed")
} else {
r.logger.Error().
Timestamp().
Err(result.err).
Str("file", result.name).
Str("duration", result.duration.String()).
Msg("Test failed")
}
results = append(results, result)
}
return nil
})
if err != nil {
return nil, err
}
return results, nil
}
func (r *Runner) runQuery(ctx context.Context, c *compiler.Compiler, name, script string) Result {
start := time.Now()
p, err := c.Compile(script)
if err != nil {
return Result{
name: name,
duration: time.Duration(0) * time.Millisecond,
err: errors.Wrap(err, "failed to compile query"),
}
}
mustFail := r.mustFail(name)
out, err := p.Run(
ctx,
runtime.WithLog(zerolog.ConsoleWriter{Out: os.Stdout}),
runtime.WithParam("static", r.settings.StaticServerAddress),
runtime.WithParam("dynamic", r.settings.DynamicServerAddress),
)
duration := time.Since(start)
if err != nil {
if mustFail {
return Result{
name: name,
duration: duration,
}
}
return Result{
name: name,
duration: duration,
err: errors.Wrap(err, "failed to execute query"),
}
}
if mustFail {
return Result{
name: name,
duration: duration,
err: errors.New("expected to fail"),
}
}
var result string
if err := json.Unmarshal(out, &result); err != nil {
return Result{
name: name,
duration: duration,
err: err,
}
}
if result == "" {
return Result{
name: name,
duration: duration,
}
}
return Result{
name: name,
duration: duration,
err: errors.New(result),
}
}
func (r *Runner) report(results []Result) Summary {
var failed int
var passed int
var sumDuration time.Duration
for _, res := range results {
if res.err != nil {
failed++
} else {
passed++
}
sumDuration += res.duration
}
return Summary{
passed: passed,
failed: failed,
duration: sumDuration,
}
}
func (r *Runner) traverseDir(ctx context.Context, dir string, iteratee func(name string) error) error {
files, err := ioutil.ReadDir(dir)
if err != nil {
r.logger.Error().
Timestamp().
Err(err).
Str("dir", dir).
Msg("failed to read scripts directory")
return err
}
for _, file := range files {
name := filepath.Join(dir, file.Name())
if file.IsDir() {
if err := r.traverseDir(ctx, name, iteratee); err != nil {
return err
}
continue
}
if err := iteratee(name); err != nil {
return err
}
}
return nil
}
func (r *Runner) mustFail(name string) bool {
return strings.HasSuffix(name, ".fail.fql")
}

View File

@ -1,103 +0,0 @@
package server
import (
"context"
"encoding/json"
"fmt"
"net/http"
"path/filepath"
"time"
"github.com/labstack/echo/v4"
)
type (
Settings struct {
Port uint64
Dir string
}
Server struct {
engine *echo.Echo
settings Settings
}
)
func New(settings Settings) *Server {
e := echo.New()
e.Debug = false
e.HideBanner = true
e.Use(func(handlerFunc echo.HandlerFunc) echo.HandlerFunc {
return func(ctx echo.Context) error {
ctx.SetCookie(&http.Cookie{
Name: "x-ferret",
Value: "e2e",
HttpOnly: false,
})
return handlerFunc(ctx)
}
})
e.Static("/", settings.Dir)
e.File("/", filepath.Join(settings.Dir, "index.html"))
api := e.Group("/api")
api.GET("/ts", func(ctx echo.Context) error {
var headers string
if len(ctx.Request().Header) > 0 {
b, err := json.Marshal(ctx.Request().Header)
if err != nil {
return err
}
headers = string(b)
}
var cookies string
if len(ctx.Request().Cookies()) > 0 {
b, err := json.Marshal(ctx.Request().Cookies())
if err != nil {
return err
}
cookies = string(b)
}
ts := time.Now().Format("2006-01-02 15:04:05")
return ctx.HTML(http.StatusOK, fmt.Sprintf(`
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
</head>
<body>
<span id="timestamp">%s</span>
<span id="headers">%s</span>
<span id="cookies">%s</span>
</body>
</html>
`, ts, headers, cookies))
})
api.GET("/ping", func(ctx echo.Context) error {
return ctx.JSON(http.StatusOK, echo.Map{
"header": ctx.Request().Header,
"url": ctx.Request().URL,
"data": "pong",
"ts": time.Now(),
})
})
return &Server{e, settings}
}
func (s *Server) Start() error {
return s.engine.Start(fmt.Sprintf("0.0.0.0:%d", s.settings.Port))
}
func (s *Server) Stop(ctx context.Context) error {
return s.engine.Shutdown(ctx)
}

View File

@ -1,10 +0,0 @@
LET url = @static + '/overview.html'
LET doc = DOCUMENT(url)
LET expectedP = TRUE
LET actualP = ELEMENT_EXISTS(doc, '.section-nav')
LET expectedN = FALSE
LET actualN = ELEMENT_EXISTS(doc, '.foo-bar')
RETURN EXPECT(expectedP + expectedN, actualP + expectedN)

View File

@ -1,10 +0,0 @@
LET url = @dynamic
LET doc = DOCUMENT(url)
LET expectedP = TRUE
LET actualP = ELEMENT_EXISTS(doc, '.text-center')
LET expectedN = FALSE
LET actualN = ELEMENT_EXISTS(doc, '.foo-bar')
RETURN EXPECT(expectedP + expectedN, actualP + expectedN)

View File

@ -1,4 +1,4 @@
LET url = @static + "/api/ts"
LET url = @lab.cdn.static + "/api/ts"
LET page = DOCUMENT(url, {
driver: "cdp_cookies"
})
@ -15,7 +15,10 @@ LET expected = {
"Multi_set_cookie": "multi_set_cookie_value",
}
RETURN EXPECT(expected, {
T::EQ({
"Single_cookie": actual[2].Value,
"Multi_set_cookie": actual[0].Value,
})
}, expected)
RETURN NONE

View File

@ -1,4 +1,4 @@
LET url = @dynamic
LET url = @lab.cdn.dynamic
LET doc = DOCUMENT(url, {
driver: "cdp",
cookies: [{
@ -15,7 +15,7 @@ COOKIE_DEL(doc, COOKIE_GET(doc, "x-e2e"), "x-e2e-2")
LET cookie1 = COOKIE_GET(doc, "x-e2e")
LET cookie2 = COOKIE_GET(doc, "x-e2e-2")
LET expected = "nonenone"
LET actual = TYPENAME(cookie1) + TYPENAME(cookie2)
T::EQ(cookie1, "none")
T::EQ(cookie2, "none")
RETURN EXPECT(expected, actual)
RETURN NONE

View File

@ -1,4 +1,4 @@
LET url = @dynamic
LET url = @lab.cdn.dynamic
LET doc = DOCUMENT(url, {
driver: "cdp"
})
@ -7,4 +7,6 @@ LET cookiesPath = LENGTH(doc.cookies) > 0 ? "ok" : "false"
LET cookie = COOKIE_GET(doc, "x-ferret")
LET expected = "ok e2e"
RETURN EXPECT(expected, cookiesPath + " " + cookie.value)
T::LEN(doc.cookies
RETURN T::EQ(cookiesPath + " " + cookie.value, expected)

View File

@ -1,4 +1,4 @@
LET url = @dynamic
LET url = @lab.cdn.dynamic
LET doc = DOCUMENT(url, {
driver: "cdp",
cookies: [{
@ -11,4 +11,4 @@ LET cookiesPath = LENGTH(doc.cookies) > 0 ? "ok" : "false"
LET cookie = COOKIE_GET(doc, "x-e2e")
LET expected = "ok test"
RETURN EXPECT(expected, cookiesPath + " " + cookie.value)
RETURN T::EQ(cookiesPath + " " + cookie.value, expected)

View File

@ -1,4 +1,4 @@
LET url = @static + "/api/ts"
LET url = @lab.cdn.static + "/api/ts"
LET page = DOCUMENT(url, {
driver: "cdp_cookies",
cookies: [
@ -25,7 +25,7 @@ LET expected = {
"Multi_set_cookie": "Bar",
}
RETURN EXPECT(expected, {
RETURN T::EQ({
"Single_cookie": actual[1].Value,
"Multi_set_cookie": actual[0].Value,
})
}, expected)

View File

@ -1,5 +1,5 @@
LET url = @dynamic
LET doc = DOCUMENT(@dynamic, {
LET url = @lab.cdn.dynamic
LET doc = DOCUMENT(@lab.cdn.dynamic, {
driver: "cdp"
})
@ -11,4 +11,4 @@ COOKIE_SET(doc, {
LET cookie = COOKIE_GET(doc, "x-e2e")
LET expected = "test"
RETURN EXPECT(expected, cookie.value)
RETURN T::EQ(cookie.value, expected)

View File

@ -0,0 +1,7 @@
LET url = @lab.cdn.dynamic
LET doc = DOCUMENT(url)
T::TRUE(ELEMENT_EXISTS(doc, '.text-center'))
T::FALSE(ELEMENT_EXISTS(doc, '.foo-bar'))
RETURN NONE

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "/#/events"
LET url = @lab.cdn.dynamic + "/#/events"
LET page = DOCUMENT(url, true)
FOCUS(page, "#focus-input")

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/iframe"
LET url = @lab.cdn.dynamic + "?redirect=/iframe"
LET page = DOCUMENT(url, { driver: 'cdp' })
LET frames = (
@ -10,10 +10,7 @@ LET frames = (
LET doc = FIRST(frames)
LET expectedP = TRUE
LET actualP = ELEMENT_EXISTS(doc, '.text-center')
T::TRUE(ELEMENT_EXISTS(doc, '.text-center'))
T::FALSE(ELEMENT_EXISTS(doc, '.foo-bar'))
LET expectedN = FALSE
LET actualN = ELEMENT_EXISTS(doc, '.foo-bar')
RETURN EXPECT(expectedP + expectedN, actualP + expectedN)
RETURN NONE

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/iframe&src=/events"
LET url = @lab.cdn.dynamic + "?redirect=/iframe&src=/events"
LET page = DOCUMENT(url, { driver: 'cdp' })
LET frames = (
FOR f IN page.frames
@ -15,4 +15,4 @@ WAIT_ELEMENT(doc, "#hoverable-content")
LET output = INNER_TEXT(doc, "#hoverable-content")
RETURN EXPECT(output, "Lorem ipsum dolor sit amet.")
RETURN T::EQ(output, "Lorem ipsum dolor sit amet.")

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/iframe&src=/forms"
LET url = @lab.cdn.dynamic + "?redirect=/iframe&src=/forms"
LET page = DOCUMENT(url, true)
LET frames = (
@ -15,4 +15,4 @@ LET output = ELEMENT(doc, "#text_output")
INPUT(doc, "#text_input", "foo")
RETURN EXPECT(output.innerText, "foo")
RETURN T::EQ(output.innerText, "foo")

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/iframe"
LET url = @lab.cdn.dynamic + "?redirect=/iframe"
LET doc = DOCUMENT(url, { driver: 'cdp' })
RETURN EXPECT(2, LENGTH(doc.frames))
RETURN T::LEN(doc.frames, 2)

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/iframe"
LET url = @lab.cdn.dynamic + "?redirect=/iframe"
LET page = DOCUMENT(url, { driver: 'cdp' })
LET frames = (
@ -7,4 +7,4 @@ LET frames = (
RETURN frame
)
RETURN EXPECT(1, LENGTH(frames))
RETURN T::LEN(frames, 1)

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/iframe&src=/events"
LET url = @lab.cdn.dynamic + "?redirect=/iframe&src=/events"
LET page = DOCUMENT(url, true)
LET frames = (
FOR f IN page.frames

View File

@ -1,4 +1,4 @@
LET url = @dynamic
LET url = @lab.cdn.dynamic
LET doc = DOCUMENT(url, true)
LET expected = `<head>
@ -27,4 +27,4 @@ LET actual = INNER_HTML(doc)
LET r1 = '(\s|\")'
LET r2 = '(\n|\s|\")'
RETURN EXPECT(REGEXP_REPLACE(expected, r1, ''), REGEXP_REPLACE(TRIM(actual), r2, ''))
RETURN T::EQ(REGEXP_REPLACE(TRIM(actual), r2, ''), REGEXP_REPLACE(expected, r1, ''))

View File

@ -1,4 +1,4 @@
LET url = @dynamic
LET url = @lab.cdn.dynamic
LET doc = DOCUMENT(url, true)
LET selector = '#root > div > main > div'
@ -7,4 +7,4 @@ WAIT_ELEMENT(doc, "#layout")
LET expected = '<div><h1>Welcome to Ferret E2E test page!</h1></div><div><p class="lead">It has several pages for testing different possibilities of the library</p></div>'
LET actual = INNER_HTML(doc, selector)
RETURN EXPECT(REGEXP_REPLACE(expected, '\s', ''), REGEXP_REPLACE(TRIM(actual), '(\n|\s)', ''))
RETURN T::EQ(REGEXP_REPLACE(TRIM(actual), '(\n|\s)', ''), REGEXP_REPLACE(expected, '\s', ''))

View File

@ -1,4 +1,4 @@
LET url = @dynamic
LET url = @lab.cdn.dynamic
LET doc = DOCUMENT(url, true)
WAIT_ELEMENT(doc, "#layout")
@ -9,4 +9,4 @@ LET expected = [
]
LET actual = INNER_HTML_ALL(doc, '#root > div > main > div > *')
RETURN EXPECT(expected, actual)
RETURN T::EQ(actual, expected)

View File

@ -1,4 +1,4 @@
LET url = @dynamic
LET url = @lab.cdn.dynamic
LET doc = DOCUMENT(url, true)
LET expected = `<span>Hello</span>`
@ -10,4 +10,4 @@ LET actual = INNER_HTML(doc, "body")
LET r1 = '(\s|\")'
LET r2 = '(\n|\s|\")'
RETURN EXPECT(REGEXP_REPLACE(expected, r1, ''), REGEXP_REPLACE(TRIM(actual), r2, ''))
RETURN T::EQ(REGEXP_REPLACE(expected, r1, ''), REGEXP_REPLACE(TRIM(actual), r2, ''))

View File

@ -1,4 +1,4 @@
LET url = @dynamic
LET url = @lab.cdn.dynamic
LET doc = DOCUMENT(url, true)
LET expected = `Ferret
@ -14,4 +14,4 @@ LET actual = INNER_TEXT(doc)
LET r1 = '(\n|\s)'
LET r2 = '(\n|\s)'
RETURN EXPECT(REGEXP_REPLACE(expected, r1, ''), REGEXP_REPLACE(TRIM(actual), r2, ''))
RETURN T::EQ(REGEXP_REPLACE(TRIM(actual), r2, ''), REGEXP_REPLACE(expected, r1, ''))

View File

@ -1,4 +1,4 @@
LET url = @dynamic
LET url = @lab.cdn.dynamic
LET doc = DOCUMENT(url, true)
LET selector = '#root > div > main > div h1'
@ -7,4 +7,4 @@ WAIT_ELEMENT(doc, "#layout")
LET expected = 'Welcome to Ferret E2E test page!'
LET actual = INNER_TEXT(doc, selector)
RETURN EXPECT(REGEXP_REPLACE(expected, '\s', ''), REGEXP_REPLACE(TRIM(actual), '(\n|\s)', ''))
RETURN T::EQ(REGEXP_REPLACE(TRIM(actual), '(\n|\s)', ''), REGEXP_REPLACE(expected, '\s', ''))

View File

@ -1,4 +1,4 @@
LET url = @dynamic
LET url = @lab.cdn.dynamic
LET doc = DOCUMENT(url, true)
LET selector = '#root > div > main > div > *'
@ -13,4 +13,4 @@ LET actual = (
RETURN REGEXP_REPLACE(TRIM(str), '\n', '')
)
RETURN EXPECT(expected, actual)
RETURN T::EQ(actual, expected)

View File

@ -1,4 +1,4 @@
LET url = @dynamic
LET url = @lab.cdn.dynamic
LET doc = DOCUMENT(url, true)
LET expected = `Hello`
@ -10,4 +10,4 @@ LET actual = INNER_TEXT(doc, "body")
LET r1 = '(\s|\")'
LET r2 = '(\n|\s|\")'
RETURN EXPECT(REGEXP_REPLACE(expected, r1, ''), REGEXP_REPLACE(TRIM(actual), r2, ''))
RETURN T::EQ(REGEXP_REPLACE(TRIM(actual), r2, ''), REGEXP_REPLACE(expected, r1, ''))

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/forms"
LET url = @lab.cdn.dynamic + "?redirect=/forms"
LET doc = DOCUMENT(url, true)
WAIT_ELEMENT(doc, "form")
@ -7,4 +7,4 @@ LET output = ELEMENT(doc, "#text_output")
INPUT(doc, "#text_input", "foo")
RETURN EXPECT(output.innerText, "foo")
RETURN T::EQ(output.innerText, "foo")

View File

@ -1,6 +1,6 @@
LET url = @dynamic
LET url = @lab.cdn.dynamic
LET p = DOCUMENT("", { driver: "cdp" })
NAVIGATE(p, url)
RETURN T::EXPECT(url + '/', p.url)
RETURN T::EQ(p.url, url + '/')

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "/#/pagination"
LET url = @lab.cdn.dynamic + "/#/pagination"
LET page = DOCUMENT(url, true)
LET items = (
@ -6,4 +6,4 @@ LET items = (
RETURN i
)
RETURN EXPECT(5, LENGTH(items))
RETURN T::LEN(items, 5)

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/forms"
LET url = @lab.cdn.dynamic + "?redirect=/forms"
LET doc = DOCUMENT(url, true)
WAIT_ELEMENT(doc, "form")
@ -6,4 +6,7 @@ WAIT_ELEMENT(doc, "form")
LET output = ELEMENT(doc, "#multi_select_output")
LET result = SELECT(doc, "#multi_select_input", ["1", "2", "4"])
RETURN EXPECT(output.innerText, "1, 2, 4") + EXPECT(JSON_STRINGIFY(result), '["1","2","4"]')
T::EQ(output.innerText, "1, 2, 4")
T::EQ(JSON_STRINGIFY(result), '["1","2","4"]')
RETURN NONE

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/forms"
LET url = @lab.cdn.dynamic + "?redirect=/forms"
LET doc = DOCUMENT(url, true)
WAIT_ELEMENT(doc, "form")
@ -6,4 +6,7 @@ WAIT_ELEMENT(doc, "form")
LET output = ELEMENT(doc, "#select_output")
LET result = SELECT(doc, "#select_input", ["4"])
RETURN EXPECT(output.innerText, "4") + EXPECT(JSON_STRINGIFY(result), '["4"]')
T::EQ(output.innerText, "4")
T::EQ(JSON_STRINGIFY(result), '["4"]')
RETURN NONE

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/media"
LET url = @lab.cdn.dynamic + "?redirect=/media"
LET expectedW = 1920
LET expectedH = 1080
@ -13,4 +13,7 @@ LET doc = DOCUMENT(url, {
LET actualW = TO_INT(INNER_TEXT(doc, '#screen-width'))
LET actualH = TO_INT(INNER_TEXT(doc, '#screen-height'))
RETURN EXPECT(expectedW, actualW) + EXPECT(expectedH, actualH)
T::EQ(actualW, expectedW)
T::EQ(actualH, expectedH)
RETURN NONE

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/events"
LET url = @lab.cdn.dynamic + "?redirect=/events"
LET doc = DOCUMENT(url, true)
LET selector = "#wait-class-btn"
LET attrName = "data-ferret-x"
@ -15,4 +15,7 @@ WAIT_ATTR(doc, selector, attrName, attrVal, 30000)
LET curr = el.attributes
RETURN prev[attrName] == NONE && curr[attrName] == attrVal ? "" : "attributes should be updated"
T::NONE(prev[attrName])
T::EQ(attrVal, curr[attrName], "attributes should be updated")
RETURN NONE

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/events"
LET url = @lab.cdn.dynamic + "?redirect=/events"
LET doc = DOCUMENT(url, true)
WAIT_ELEMENT(doc, "#page-events")
@ -6,4 +6,4 @@ WAIT_ELEMENT(doc, "#page-events")
CLICK_ALL(doc, "#wait-class-btn, #wait-class-random-btn")
WAIT_ATTR_ALL(doc, "#wait-class-content, #wait-class-random-content", "class", "alert alert-success", 10000)
RETURN ""
RETURN NONE

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/events"
LET url = @lab.cdn.dynamic + "?redirect=/events"
LET doc = DOCUMENT(url, true)
WAIT_ELEMENT(doc, "#page-events")
@ -11,4 +11,4 @@ WAIT_CLASS(doc, "#wait-class-content", "alert-success")
CLICK(doc, "#wait-class-random-btn")
WAIT_CLASS(doc, "#wait-class-random-content", "alert-success", 10000)
RETURN ""
RETURN NONE

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/events"
LET url = @lab.cdn.dynamic + "?redirect=/events"
LET doc = DOCUMENT(url, true)
WAIT_ELEMENT(doc, "#page-events")
@ -6,4 +6,4 @@ WAIT_ELEMENT(doc, "#page-events")
CLICK_ALL(doc, "#wait-class-btn, #wait-class-random-btn")
WAIT_CLASS_ALL(doc, "#wait-class-content, #wait-class-random-content", "alert-success", 10000)
RETURN ""
RETURN NONE

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/events"
LET url = @lab.cdn.dynamic + "?redirect=/events"
LET doc = DOCUMENT(url, true)
LET pageSelector = "#page-events"
LET elemSelector = "#wait-element-content"
@ -10,4 +10,6 @@ CLICK(doc, btnSelector)
WAIT_ELEMENT(doc, elemSelector, 10000)
RETURN ELEMENT_EXISTS(doc, elemSelector) ? "" : "element not found"
T::TRUE(ELEMENT_EXISTS(doc, elemSelector), "element not found")
RETURN NONE

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/events"
LET url = @lab.cdn.dynamic + "?redirect=/events"
LET doc = DOCUMENT(url, true)
WAIT_ELEMENT(doc, "#page-events")
@ -13,4 +13,4 @@ WAIT_NO_ATTR(doc, "#wait-no-class-content", "class", "alert alert-success")
CLICK(doc, "#wait-no-class-random-btn")
WAIT_NO_ATTR(doc, "#wait-no-class-random-content", "class", "alert alert-success", 10000)
RETURN ""
RETURN NONE

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/events"
LET url = @lab.cdn.dynamic + "?redirect=/events"
LET doc = DOCUMENT(url, true)
WAIT_ELEMENT(doc, "#page-events")
@ -11,4 +11,4 @@ WAIT_NO_CLASS(doc, "#wait-no-class-content", "alert-success")
CLICK(doc, "#wait-no-class-random-btn")
WAIT_NO_CLASS(doc, "#wait-no-class-random-content", "alert-success", 10000)
RETURN ""
RETURN NONE

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/events"
LET url = @lab.cdn.dynamic + "?redirect=/events"
LET doc = DOCUMENT(url, true)
WAIT_ELEMENT(doc, "#page-events")
@ -6,4 +6,4 @@ WAIT_ELEMENT(doc, "#page-events")
CLICK_ALL(doc, "#wait-no-class-btn, #wait-no-class-random-btn")
WAIT_NO_CLASS_ALL(doc, "#wait-no-class-content, #wait-no-class-random-content", "alert-success", 10000)
RETURN ""
RETURN NONE

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/events"
LET url = @lab.cdn.dynamic + "?redirect=/events"
LET doc = DOCUMENT(url, true)
LET pageSelector = "#page-events"
LET elemSelector = "#wait-no-element-content"
@ -10,4 +10,6 @@ CLICK(doc, btnSelector)
WAIT_NO_ELEMENT(doc, elemSelector, 10000)
RETURN ELEMENT_EXISTS(doc, elemSelector) ? "element should not be found" : ""
T::FALSE(ELEMENT_EXISTS(doc, elemSelector), "element should not be found")
RETURN NONE

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/events"
LET url = @lab.cdn.dynamic + "?redirect=/events"
LET doc = DOCUMENT(url, true)
LET selector = "#wait-class-btn"
@ -16,4 +16,7 @@ WAIT_NO_STYLE(doc, selector, "width", "100%")
LET curr = el.style
RETURN prev.width == "100%" && curr.width == "50%" ? "" : "style should be changed"
T::EQ(prev.width, "100%")
T::EQ(curr.width, "50%")
RETURN NONE

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/events"
LET url = @lab.cdn.dynamic + "?redirect=/events"
LET doc = DOCUMENT(url, true)
LET selector = "#wait-class-btn, #wait-class-random-btn"
@ -27,4 +27,6 @@ LET results = (
RETURN el.style.color
)
RETURN CONCAT(results) == "redred" ? "" : "styles should be updated"
T::EQ(CONCAT(results), "redred", "styles should be updated")
RETURN NONE

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/events"
LET url = @lab.cdn.dynamic + "?redirect=/events"
LET doc = DOCUMENT(url, true)
LET selector = "#wait-class-btn"
@ -12,4 +12,7 @@ WAIT_STYLE(doc, selector, "width", "100%")
LET curr = el.style
RETURN prev.width == NONE && curr.width == "100%" ? "" : "style should be updated"
T::NONE(prev.width)
T::EQ(curr.width, "100%", "style should be updated")
RETURN NONE

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/events"
LET url = @lab.cdn.dynamic + "?redirect=/events"
LET doc = DOCUMENT(url, true)
LET selector = "#wait-class-btn, #wait-class-random-btn"
@ -18,4 +18,6 @@ LET results = (
RETURN el.style.color
)
RETURN CONCAT(results) == "blackblack" ? "" : "styles should be updated"
T::EQ(CONCAT(results), "blackblack", "styles should be updated")
RETURN NONE

View File

@ -1,6 +1,6 @@
LET url = @dynamic
LET url = @lab.cdn.dynamic
LET page = DOCUMENT(url, { driver: "cdp" })
LET actual = XPATH(page, "//meta/@charset")
RETURN EXPECT(["utf-8"], actual)
RETURN T::EQ(actual, ["utf-8"])

View File

@ -1,6 +1,6 @@
LET url = @dynamic
LET url = @lab.cdn.dynamic
LET page = DOCUMENT(url, { driver: "cdp" })
LET actual = XPATH(page, "count(//body)")
RETURN EXPECT(1, actual)
RETURN T::EQ(actual, 1)

View File

@ -1,6 +1,6 @@
LET url = @dynamic + "?redirect=/forms"
LET url = @lab.cdn.dynamic + "?redirect=/forms"
LET page = DOCUMENT(url, { driver: "cdp" })
LET actual = XPATH(page, "//div[contains(@class, 'form-group')]")
RETURN EXPECT(4, LENGTH(actual))
RETURN T::LEN(actual, 4)

View File

@ -1,4 +1,4 @@
LET url = @dynamic
LET url = @lab.cdn.dynamic
LET doc = DOCUMENT(url, { driver: "cdp" })
LET el = ELEMENT(doc, "#index")
@ -10,4 +10,6 @@ LET attrs = [
LET expected = '["jumbotron","page"]'
LET actual = TO_STRING(attrs)
RETURN EXPECT(expected, actual)
T::EQ(actual, expected)
RETURN NONE

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/events"
LET url = @lab.cdn.dynamic + "?redirect=/events"
LET doc = DOCUMENT(url, true)
LET pageSelector = "#page-events"
LET elemSelector = "#wait-no-style-content"
@ -8,4 +8,6 @@ WAIT_ELEMENT(doc, pageSelector)
LET el = ELEMENT(doc, elemSelector)
LET attrs = ATTR_GET(el, "style")
RETURN EXPECT("display: block;", attrs.style)
T::EQ(attrs.style, "display: block;")
RETURN NONE

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/events"
LET url = @lab.cdn.dynamic + "?redirect=/events"
LET doc = DOCUMENT(url, true)
LET pageSelector = "#page-events"
LET elemSelector = "#wait-no-style-content"
@ -14,4 +14,7 @@ WAIT(1000)
LET curr = el.attributes.style
RETURN prev == "display: block;" && curr == NONE ? "" : "expected attribute to be removed"
T::EQ(prev, "display: block;")
T::NONE(curr, "expected attribute to be removed")
RETURN NONE

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/events"
LET url = @lab.cdn.dynamic + "?redirect=/events"
LET doc = DOCUMENT(url, true)
LET pageSelector = "#page-events"
LET elemSelector = "#wait-no-style-content"
@ -14,4 +14,6 @@ WAIT(1000)
LET curr = el.style
RETURN curr.color == "black" ? "" : "styles should be updated"
T::EQ(curr.color, "black", "styles should be updated")
RETURN NONE

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/events"
LET url = @lab.cdn.dynamic + "?redirect=/events"
LET doc = DOCUMENT(url, true)
LET pageSelector = "#page-events"
LET elemSelector = "#wait-no-style-content"
@ -11,4 +11,7 @@ ATTR_SET(el, { style: "color: black;", "data-ferret-x": "test" })
WAIT(1000)
RETURN el.style.color == "black" && el.attributes["data-ferret-x"] == "test" ? "" : "styles should be updated"
T::EQ(el.style.color, "black")
T::EQ(el.attributes["data-ferret-x"], "test", "styles should be updated")
RETURN NONE

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "/#/events"
LET url = @lab.cdn.dynamic + "/#/events"
LET page = DOCUMENT(url, true)
LET input = ELEMENT(page, "#focus-input")

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "/#/events"
LET url = @lab.cdn.dynamic + "/#/events"
LET page = DOCUMENT(url, true)
FOCUS(page, "#focus-input")

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/forms"
LET url = @lab.cdn.dynamic + "?redirect=/forms"
LET doc = DOCUMENT(url, true)
WAIT_ELEMENT(doc, "form")
@ -9,4 +9,6 @@ INPUT(input, "Foo", 100)
INPUT_CLEAR(input)
RETURN EXPECT("", INNER_TEXT(doc, "#text_output"))
T::EMPTY(INNER_TEXT(doc, "#text_output"))
RETURN NONE

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/forms"
LET url = @lab.cdn.dynamic + "?redirect=/forms"
LET doc = DOCUMENT(url, true)
WAIT_ELEMENT(doc, "form")
@ -11,4 +11,6 @@ INPUT_CLEAR(form, "#text_input")
LET input = ELEMENT(doc, "#text_input")
LET output = ELEMENT(doc, "#text_output")
RETURN EXPECT("", output.innerText)
T::EMPTY(output.innerText)
RETURN NONE

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "/#/events"
LET url = @lab.cdn.dynamic + "/#/events"
LET page = DOCUMENT(url, true)
LET btn = ELEMENT(page, "#wait-class-random-btn")

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "/#/events"
LET url = @lab.cdn.dynamic + "/#/events"
LET page = DOCUMENT(url, true)
LET div = ELEMENT(page, "#wait-class-random")

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "/#/forms"
LET url = @lab.cdn.dynamic + "/#/forms"
LET page = DOCUMENT(url, true)
WAIT_ELEMENT(page, "form")
@ -13,4 +13,4 @@ INPUT(input, "Bar")
WAIT(100)
RETURN EXPECT("Bar", input.value)
RETURN T::EQ(input.value, "Bar")

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "/#/forms"
LET url = @lab.cdn.dynamic + "/#/forms"
LET page = DOCUMENT(url, true)
WAIT_ELEMENT(page, "form")
@ -13,4 +13,4 @@ INPUT(input, "Bar")
WAIT(100)
RETURN EXPECT("Bar", input.value)
RETURN T::EQ(input.value, "Bar")

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "/#/events"
LET url = @lab.cdn.dynamic + "/#/events"
LET page = DOCUMENT(url, true)
LET input = ELEMENT(page, "#focus-input")

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "/#/events"
LET url = @lab.cdn.dynamic + "/#/events"
LET page = DOCUMENT(url, true)
FOCUS(page, "#focus-input")

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/events"
LET url = @lab.cdn.dynamic + "?redirect=/events"
LET doc = DOCUMENT(url, true)
WAIT_ELEMENT(doc, "#page-events")
@ -10,4 +10,4 @@ WAIT_ELEMENT(doc, "#hoverable-content")
LET output = ELEMENT(doc, "#hoverable-content")
RETURN EXPECT(output.innerText, "Lorem ipsum dolor sit amet.")
RETURN T::EQ(output.innerText, "Lorem ipsum dolor sit amet.")

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/events"
LET url = @lab.cdn.dynamic + "?redirect=/events"
LET doc = DOCUMENT(url, true)
WAIT_ELEMENT(doc, "#page-events")
@ -8,4 +8,4 @@ WAIT_ELEMENT(doc, "#hoverable-content")
LET output = INNER_TEXT(doc, "#hoverable-content")
RETURN EXPECT(output, "Lorem ipsum dolor sit amet.")
RETURN T::EQ(output, "Lorem ipsum dolor sit amet.")

View File

@ -1,8 +1,8 @@
LET url = @dynamic + "?redirect=/iframe&src=/events"
LET url = @lab.cdn.dynamic + "?redirect=/iframe&src=/events"
LET page = DOCUMENT(url, { driver: 'cdp' })
LET doc = page.frames[1]
WAIT_ELEMENT(doc, "#page-events")
WAIT_ELEMENT(doc, "#page-events", 5000)
LET input = ELEMENT(doc, "#hoverable-btn")
@ -11,4 +11,4 @@ WAIT_ELEMENT(doc, "#hoverable-content")
LET output = ELEMENT(doc, "#hoverable-content")
RETURN EXPECT(output.innerText, "Lorem ipsum dolor sit amet.")
RETURN T::EQ(output.innerText, "Lorem ipsum dolor sit amet.")

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/iframe&src=/forms"
LET url = @lab.cdn.dynamic + "?redirect=/iframe&src=/forms"
LET page = DOCUMENT(url, { driver: 'cdp' })
LET doc = page.frames[1]
@ -9,4 +9,4 @@ LET output = ELEMENT(doc, "#text_output")
INPUT(input, "foo")
RETURN EXPECT(output.innerText, "foo")
RETURN T::EQ(output.innerText, "foo")

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/iframe&src=/forms"
LET url = @lab.cdn.dynamic + "?redirect=/iframe&src=/forms"
LET page = DOCUMENT(url, { driver: 'cdp' })
LET doc = page.frames[1]
@ -8,4 +8,7 @@ LET input = ELEMENT(doc, "#select_input")
LET output = ELEMENT(doc, "#select_output")
LET result = SELECT(input, ["4"])
RETURN EXPECT(output.innerText, "4") + EXPECT(JSON_STRINGIFY(result), '["4"]')
T::EQ(output.innerText, "4")
T::EQ(result, ["4"])
RETURN NONE

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/iframe&src=/events"
LET url = @lab.cdn.dynamic + "?redirect=/iframe&src=/events"
LET page = DOCUMENT(url, { driver: 'cdp' })
LET doc = page.frames[1]

View File

@ -1,4 +1,4 @@
LET url = @dynamic
LET url = @lab.cdn.dynamic
LET doc = DOCUMENT(url, true)
LET el = ELEMENT(doc, "#root")
@ -8,4 +8,4 @@ LET actual = INNER_HTML(el)
LET r1 = '(\s|\")'
LET r2 = '(\n|\s|\")'
RETURN EXPECT(REGEXP_REPLACE(expected, r1, ''), REGEXP_REPLACE(TRIM(actual), r2, ''))
RETURN T::EQ(REGEXP_REPLACE(TRIM(actual), r2, ''), REGEXP_REPLACE(expected, r1, ''))

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "/#/lists"
LET url = @lab.cdn.dynamic + "/#/lists"
LET doc = DOCUMENT(url, true)
LET expected = [
@ -31,4 +31,4 @@ LET actual = (
}
)
RETURN EXPECT(expected, actual)
RETURN T::EQ(actual, expected)

View File

@ -1,4 +1,4 @@
LET url = @dynamic
LET url = @lab.cdn.dynamic
LET doc = DOCUMENT(url, true)
LET el = ELEMENT(doc, ".jumbotron")

View File

@ -1,4 +1,4 @@
LET url = @dynamic
LET url = @lab.cdn.dynamic
LET doc = DOCUMENT(url, true)
LET el = ELEMENT(doc, "#index")
@ -11,4 +11,4 @@ WAIT(100)
LET r1 = '(\s|\")'
LET r2 = '(\n|\s|\")'
RETURN EXPECT(REGEXP_REPLACE(expected, r1, ''), REGEXP_REPLACE(TRIM(actual), r2, ''))
RETURN T::EQ(REGEXP_REPLACE(TRIM(actual), r2, ''), REGEXP_REPLACE(expected, r1, ''))

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "/#/lists"
LET url = @lab.cdn.dynamic + "/#/lists"
LET doc = DOCUMENT(url, true)
LET expected = [
@ -22,4 +22,4 @@ LET actual = (
}
)
RETURN EXPECT(expected, actual)
RETURN T::EQ(actual, expected)

View File

@ -1,4 +1,4 @@
LET url = @dynamic
LET url = @lab.cdn.dynamic
LET doc = DOCUMENT(url, true)
LET el = ELEMENT(doc, ".jumbotron")
@ -11,4 +11,4 @@ LET actual = INNER_TEXT(el)
LET r1 = '(\n|\s)'
LET r2 = '(\n|\s)'
RETURN EXPECT(REGEXP_REPLACE(expected, r1, ''), REGEXP_REPLACE(TRIM(actual), r2, ''))
RETURN T::EQ(REGEXP_REPLACE(TRIM(actual), r2, ''), REGEXP_REPLACE(expected, r1, ''))

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "/#/lists"
LET url = @lab.cdn.dynamic + "/#/lists"
LET doc = DOCUMENT(url, true)
LET expected = [
@ -31,4 +31,4 @@ LET actual = (
}
)
RETURN EXPECT(expected, actual)
RETURN T::EQ(actual, expected)

View File

@ -1,4 +1,4 @@
LET url = @dynamic
LET url = @lab.cdn.dynamic
LET doc = DOCUMENT(url, true)
LET el = ELEMENT(doc, ".jumbotron")

View File

@ -1,4 +1,4 @@
LET url = @dynamic
LET url = @lab.cdn.dynamic
LET doc = DOCUMENT(url, true)
LET el = ELEMENT(doc, ".jumbotron")
@ -10,4 +10,4 @@ LET actual = INNER_TEXT(el)
LET r1 = '(\n|\s)'
LET r2 = '(\n|\s)'
RETURN EXPECT(REGEXP_REPLACE(expected, r1, ''), REGEXP_REPLACE(TRIM(actual), r2, ''))
RETURN T::EQ(REGEXP_REPLACE(TRIM(actual), r2, ''), REGEXP_REPLACE(expected, r1, ''))

View File

@ -1,4 +1,4 @@
LET url = @dynamic
LET url = @lab.cdn.dynamic
LET doc = DOCUMENT(url, true)
LET el = ELEMENT(doc, ".jumbotron")

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "/#/lists"
LET url = @lab.cdn.dynamic + "/#/lists"
LET doc = DOCUMENT(url, true)
LET expected = [
@ -34,4 +34,4 @@ LET actual = (
}
)
RETURN EXPECT(expected, actual)
RETURN T::EQ(actual, expected)

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/forms"
LET url = @lab.cdn.dynamic + "?redirect=/forms"
LET doc = DOCUMENT(url, true)
WAIT_ELEMENT(doc, "form")
@ -8,4 +8,4 @@ LET output = ELEMENT(doc, "#text_output")
INPUT(input, "foo")
RETURN EXPECT(output.innerText, "foo")
RETURN T::EQ(output.innerText, "foo")

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/forms"
LET url = @lab.cdn.dynamic + "?redirect=/forms"
LET doc = DOCUMENT(url, true)
WAIT_ELEMENT(doc, "form")
@ -9,4 +9,4 @@ INPUT(form, "#text_input", "foo")
LET output = ELEMENT(doc, "#text_output")
RETURN EXPECT(output.innerText, "foo")
RETURN T::EQ(output.innerText, "foo")

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/forms"
LET url = @lab.cdn.dynamic + "?redirect=/forms"
LET doc = DOCUMENT(url, true)
WAIT_ELEMENT(doc, "form")
@ -9,4 +9,4 @@ INPUT(form, "#text_input", "foo", 100)
LET output = ELEMENT(doc, "#text_output")
RETURN EXPECT(output.innerText, "foo")
RETURN T::EQ(output.innerText, "foo")

View File

@ -0,0 +1,9 @@
LET url = @lab.cdn.dynamic
LET doc = DOCUMENT(url, true)
LET el = ELEMENT(doc, "#root")
T::TRUE(ELEMENT_EXISTS(el, '.jumbotron'))
T::FALSE(ELEMENT_EXISTS(el, '.foo-bar'))
RETURN NONE

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/forms"
LET url = @lab.cdn.dynamic + "?redirect=/forms"
LET doc = DOCUMENT(url, true)
WAIT_ELEMENT(doc, "form")
@ -7,4 +7,7 @@ LET input = ELEMENT(doc, "#multi_select_input")
LET output = ELEMENT(doc, "#multi_select_output")
LET result = SELECT(input, ["1", "2", "4"])
RETURN EXPECT(output.innerText, "1, 2, 4") + EXPECT(JSON_STRINGIFY(result), '["1","2","4"]')
T::EQ(output.innerText, "1, 2, 4")
T::EQ(result, ["1","2","4"])
RETURN NONE

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/forms"
LET url = @lab.cdn.dynamic + "?redirect=/forms"
LET doc = DOCUMENT(url, true)
WAIT_ELEMENT(doc, "form")
@ -7,4 +7,7 @@ LET input = ELEMENT(doc, "#select_input")
LET output = ELEMENT(doc, "#select_output")
LET result = SELECT(input, ["4"])
RETURN EXPECT(output.innerText, "4") + EXPECT(JSON_STRINGIFY(result), '["4"]')
T::EQ(output.innerText, "4")
T::EQ(result, ["4"])
RETURN NONE

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/events"
LET url = @lab.cdn.dynamic + "?redirect=/events"
LET doc = DOCUMENT(url, true)
LET pageSelector = "#page-events"
LET elemSelector = "#wait-no-style-content"
@ -8,4 +8,6 @@ WAIT_ELEMENT(doc, pageSelector)
LET el = ELEMENT(doc, elemSelector)
LET val = STYLE_GET(el, "display")
RETURN val.display == "block" ? "" : "could not get style values"
T::EQ(val.display, "block", "could not get style values")
RETURN NONE

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/events"
LET url = @lab.cdn.dynamic + "?redirect=/events"
LET doc = DOCUMENT(url, true)
LET pageSelector = "#page-events"
LET elemSelector = "#wait-no-style-content"
@ -14,4 +14,7 @@ WAIT(1000)
LET curr = el.style
RETURN prev.display == "block" && curr.display == NONE ? "" : "expected style to be removed"
T::EQ(prev.display, "block")
T::NONE(curr.display, "expected style to be removed")
RETURN NONE

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/events"
LET url = @lab.cdn.dynamic + "?redirect=/events"
LET doc = DOCUMENT(url, true)
LET pageSelector = "#page-events"
LET elemSelector = "#wait-no-style-content"
@ -14,4 +14,6 @@ WAIT(1000)
LET curr = el.style
RETURN curr.color == "black" ? "" : "styles should be updated"
T::EQ(curr.color, "black", "styles should be updated")
RETURN NONE

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/events"
LET url = @lab.cdn.dynamic + "?redirect=/events"
LET doc = DOCUMENT(url, true)
LET pageSelector = "#page-events"
LET elemSelector = "#wait-no-style-content"
@ -14,4 +14,8 @@ WAIT(1000)
LET curr = el.style
RETURN curr.color == "black" && curr["min-width"] == "100px" && curr["background-color"] == "#11111" ? "" : "styles should be updated"
T::EQ(curr.color, "black", "color should be updated")
T::EQ(curr["min-width"], "100px", "min width should be updated")
T::EQ(curr["background-color"], "#11111", "background color should be updated")
RETURN NONE

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/forms"
LET url = @lab.cdn.dynamic + "?redirect=/forms"
LET doc = DOCUMENT(url, true)
LET el = ELEMENT(doc, "#select_input")
@ -6,4 +6,6 @@ LET el = ELEMENT(doc, "#select_input")
LET expected = "1"
LET actual = el.value
RETURN EXPECT(actual, expected)
T::EQ(actual, expected)
RETURN NONE

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/events"
LET url = @lab.cdn.dynamic + "?redirect=/events"
LET doc = DOCUMENT(url, true)
WAIT_ELEMENT(doc, "#page-events")
@ -17,4 +17,4 @@ LET c2 = ELEMENT(doc, "#wait-class-random-content")
CLICK(b2)
WAIT_ATTR(c2, "class", "alert alert-success", 10000)
RETURN ""
RETURN NONE

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/events"
LET url = @lab.cdn.dynamic + "?redirect=/events"
LET doc = DOCUMENT(url, true)
WAIT_ELEMENT(doc, "#page-events")
@ -11,4 +11,6 @@ WAIT_ATTR(el, "data-test", "test")
ATTR_REMOVE(el, "class")
WAIT_ATTR(el, "class", NONE)
RETURN el.attributes.class == NONE ? "" : "attribute should be removed"
T::NONE(el.attributes.class, "attribute should be removed")
RETURN NONE

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/events"
LET url = @lab.cdn.dynamic + "?redirect=/events"
LET doc = DOCUMENT(url, true)
WAIT_ELEMENT(doc, "#page-events")
@ -17,4 +17,4 @@ LET c2 = ELEMENT(doc, "#wait-class-random-content")
CLICK(b2)
WAIT_CLASS(c2, "alert-success", 10000)
RETURN ""
RETURN NONE

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/events"
LET url = @lab.cdn.dynamic + "?redirect=/events"
LET doc = DOCUMENT(url, true)
WAIT_ELEMENT(doc, "#page-events")
@ -17,4 +17,4 @@ LET c2 = ELEMENT(doc, "#wait-no-class-random-content")
CLICK(b2)
WAIT_NO_ATTR(c2, "class", "alert alert-success", 10000)
RETURN ""
RETURN NONE

View File

@ -1,4 +1,4 @@
LET url = @dynamic + "?redirect=/events"
LET url = @lab.cdn.dynamic + "?redirect=/events"
LET doc = DOCUMENT(url, true)
WAIT_ELEMENT(doc, "#page-events")
@ -17,4 +17,4 @@ LET c2 = ELEMENT(doc, "#wait-no-class-random-content")
CLICK(b2)
WAIT_NO_CLASS(c2, "alert-success", 10000)
RETURN ""
RETURN NONE

Some files were not shown because too many files have changed in this diff Show More