mirror of
https://github.com/MontFerret/ferret.git
synced 2025-11-27 22:08:15 +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:
@@ -66,10 +66,12 @@ jobs:
|
|||||||
- stage: e2e
|
- stage: e2e
|
||||||
go: stable
|
go: stable
|
||||||
before_script:
|
before_script:
|
||||||
- docker pull microbox/chromium-headless:77.0.3844.0
|
- curl https://raw.githubusercontent.com/MontFerret/lab/master/install.sh -o install.sh
|
||||||
- docker run -d -p 9222:9222 microbox/chromium-headless:77.0.3844.0
|
- 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
|
- docker ps
|
||||||
script:
|
script:
|
||||||
|
- make compile
|
||||||
- make e2e
|
- make e2e
|
||||||
after_script:
|
after_script:
|
||||||
- docker stop $(docker ps -q)
|
- docker stop $(docker ps -q)
|
||||||
|
|||||||
3
Makefile
3
Makefile
@@ -30,8 +30,7 @@ cover:
|
|||||||
curl -s https://codecov.io/bash | bash
|
curl -s https://codecov.io/bash | bash
|
||||||
|
|
||||||
e2e:
|
e2e:
|
||||||
go run ${DIR_E2E}/main.go --tests ${DIR_E2E}/tests --pages ${DIR_E2E}/pages
|
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
|
||||||
# --filter=e2e/tests/dynamic/element/inner_text/get_by_selector.fql
|
|
||||||
|
|
||||||
bench:
|
bench:
|
||||||
go test -run=XXX -bench=. ${DIR_PKG}/...
|
go test -run=XXX -bench=. ${DIR_PKG}/...
|
||||||
|
|||||||
136
e2e/main.go
136
e2e/main.go
@@ -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)
|
|
||||||
}
|
|
||||||
@@ -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
|
|
||||||
}
|
|
||||||
@@ -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")
|
|
||||||
}
|
|
||||||
@@ -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)
|
|
||||||
}
|
|
||||||
@@ -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)
|
|
||||||
@@ -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)
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @static + "/api/ts"
|
LET url = @lab.cdn.static + "/api/ts"
|
||||||
LET page = DOCUMENT(url, {
|
LET page = DOCUMENT(url, {
|
||||||
driver: "cdp_cookies"
|
driver: "cdp_cookies"
|
||||||
})
|
})
|
||||||
@@ -15,7 +15,10 @@ LET expected = {
|
|||||||
"Multi_set_cookie": "multi_set_cookie_value",
|
"Multi_set_cookie": "multi_set_cookie_value",
|
||||||
}
|
}
|
||||||
|
|
||||||
RETURN EXPECT(expected, {
|
T::EQ({
|
||||||
"Single_cookie": actual[2].Value,
|
"Single_cookie": actual[2].Value,
|
||||||
"Multi_set_cookie": actual[0].Value,
|
"Multi_set_cookie": actual[0].Value,
|
||||||
})
|
}, expected)
|
||||||
|
|
||||||
|
|
||||||
|
RETURN NONE
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic
|
LET url = @lab.cdn.dynamic
|
||||||
LET doc = DOCUMENT(url, {
|
LET doc = DOCUMENT(url, {
|
||||||
driver: "cdp",
|
driver: "cdp",
|
||||||
cookies: [{
|
cookies: [{
|
||||||
@@ -15,7 +15,7 @@ COOKIE_DEL(doc, COOKIE_GET(doc, "x-e2e"), "x-e2e-2")
|
|||||||
LET cookie1 = COOKIE_GET(doc, "x-e2e")
|
LET cookie1 = COOKIE_GET(doc, "x-e2e")
|
||||||
LET cookie2 = COOKIE_GET(doc, "x-e2e-2")
|
LET cookie2 = COOKIE_GET(doc, "x-e2e-2")
|
||||||
|
|
||||||
LET expected = "nonenone"
|
T::EQ(cookie1, "none")
|
||||||
LET actual = TYPENAME(cookie1) + TYPENAME(cookie2)
|
T::EQ(cookie2, "none")
|
||||||
|
|
||||||
RETURN EXPECT(expected, actual)
|
RETURN NONE
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic
|
LET url = @lab.cdn.dynamic
|
||||||
LET doc = DOCUMENT(url, {
|
LET doc = DOCUMENT(url, {
|
||||||
driver: "cdp"
|
driver: "cdp"
|
||||||
})
|
})
|
||||||
@@ -7,4 +7,6 @@ LET cookiesPath = LENGTH(doc.cookies) > 0 ? "ok" : "false"
|
|||||||
LET cookie = COOKIE_GET(doc, "x-ferret")
|
LET cookie = COOKIE_GET(doc, "x-ferret")
|
||||||
LET expected = "ok e2e"
|
LET expected = "ok e2e"
|
||||||
|
|
||||||
RETURN EXPECT(expected, cookiesPath + " " + cookie.value)
|
T::LEN(doc.cookies
|
||||||
|
|
||||||
|
RETURN T::EQ(cookiesPath + " " + cookie.value, expected)
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic
|
LET url = @lab.cdn.dynamic
|
||||||
LET doc = DOCUMENT(url, {
|
LET doc = DOCUMENT(url, {
|
||||||
driver: "cdp",
|
driver: "cdp",
|
||||||
cookies: [{
|
cookies: [{
|
||||||
@@ -11,4 +11,4 @@ LET cookiesPath = LENGTH(doc.cookies) > 0 ? "ok" : "false"
|
|||||||
LET cookie = COOKIE_GET(doc, "x-e2e")
|
LET cookie = COOKIE_GET(doc, "x-e2e")
|
||||||
LET expected = "ok test"
|
LET expected = "ok test"
|
||||||
|
|
||||||
RETURN EXPECT(expected, cookiesPath + " " + cookie.value)
|
RETURN T::EQ(cookiesPath + " " + cookie.value, expected)
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @static + "/api/ts"
|
LET url = @lab.cdn.static + "/api/ts"
|
||||||
LET page = DOCUMENT(url, {
|
LET page = DOCUMENT(url, {
|
||||||
driver: "cdp_cookies",
|
driver: "cdp_cookies",
|
||||||
cookies: [
|
cookies: [
|
||||||
@@ -25,7 +25,7 @@ LET expected = {
|
|||||||
"Multi_set_cookie": "Bar",
|
"Multi_set_cookie": "Bar",
|
||||||
}
|
}
|
||||||
|
|
||||||
RETURN EXPECT(expected, {
|
RETURN T::EQ({
|
||||||
"Single_cookie": actual[1].Value,
|
"Single_cookie": actual[1].Value,
|
||||||
"Multi_set_cookie": actual[0].Value,
|
"Multi_set_cookie": actual[0].Value,
|
||||||
})
|
}, expected)
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
LET url = @dynamic
|
LET url = @lab.cdn.dynamic
|
||||||
LET doc = DOCUMENT(@dynamic, {
|
LET doc = DOCUMENT(@lab.cdn.dynamic, {
|
||||||
driver: "cdp"
|
driver: "cdp"
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -11,4 +11,4 @@ COOKIE_SET(doc, {
|
|||||||
LET cookie = COOKIE_GET(doc, "x-e2e")
|
LET cookie = COOKIE_GET(doc, "x-e2e")
|
||||||
LET expected = "test"
|
LET expected = "test"
|
||||||
|
|
||||||
RETURN EXPECT(expected, cookie.value)
|
RETURN T::EQ(cookie.value, expected)
|
||||||
7
e2e/tests/dynamic/doc/element/exists.fql
Normal file
7
e2e/tests/dynamic/doc/element/exists.fql
Normal 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
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "/#/events"
|
LET url = @lab.cdn.dynamic + "/#/events"
|
||||||
LET page = DOCUMENT(url, true)
|
LET page = DOCUMENT(url, true)
|
||||||
|
|
||||||
FOCUS(page, "#focus-input")
|
FOCUS(page, "#focus-input")
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "?redirect=/iframe"
|
LET url = @lab.cdn.dynamic + "?redirect=/iframe"
|
||||||
LET page = DOCUMENT(url, { driver: 'cdp' })
|
LET page = DOCUMENT(url, { driver: 'cdp' })
|
||||||
|
|
||||||
LET frames = (
|
LET frames = (
|
||||||
@@ -10,10 +10,7 @@ LET frames = (
|
|||||||
|
|
||||||
LET doc = FIRST(frames)
|
LET doc = FIRST(frames)
|
||||||
|
|
||||||
LET expectedP = TRUE
|
T::TRUE(ELEMENT_EXISTS(doc, '.text-center'))
|
||||||
LET actualP = ELEMENT_EXISTS(doc, '.text-center')
|
T::FALSE(ELEMENT_EXISTS(doc, '.foo-bar'))
|
||||||
|
|
||||||
LET expectedN = FALSE
|
RETURN NONE
|
||||||
LET actualN = ELEMENT_EXISTS(doc, '.foo-bar')
|
|
||||||
|
|
||||||
RETURN EXPECT(expectedP + expectedN, actualP + expectedN)
|
|
||||||
@@ -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 page = DOCUMENT(url, { driver: 'cdp' })
|
||||||
LET frames = (
|
LET frames = (
|
||||||
FOR f IN page.frames
|
FOR f IN page.frames
|
||||||
@@ -15,4 +15,4 @@ WAIT_ELEMENT(doc, "#hoverable-content")
|
|||||||
|
|
||||||
LET output = INNER_TEXT(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.")
|
||||||
@@ -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 page = DOCUMENT(url, true)
|
||||||
|
|
||||||
LET frames = (
|
LET frames = (
|
||||||
@@ -15,4 +15,4 @@ LET output = ELEMENT(doc, "#text_output")
|
|||||||
|
|
||||||
INPUT(doc, "#text_input", "foo")
|
INPUT(doc, "#text_input", "foo")
|
||||||
|
|
||||||
RETURN EXPECT(output.innerText, "foo")
|
RETURN T::EQ(output.innerText, "foo")
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "?redirect=/iframe"
|
LET url = @lab.cdn.dynamic + "?redirect=/iframe"
|
||||||
LET doc = DOCUMENT(url, { driver: 'cdp' })
|
LET doc = DOCUMENT(url, { driver: 'cdp' })
|
||||||
|
|
||||||
RETURN EXPECT(2, LENGTH(doc.frames))
|
RETURN T::LEN(doc.frames, 2)
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "?redirect=/iframe"
|
LET url = @lab.cdn.dynamic + "?redirect=/iframe"
|
||||||
LET page = DOCUMENT(url, { driver: 'cdp' })
|
LET page = DOCUMENT(url, { driver: 'cdp' })
|
||||||
|
|
||||||
LET frames = (
|
LET frames = (
|
||||||
@@ -7,4 +7,4 @@ LET frames = (
|
|||||||
RETURN frame
|
RETURN frame
|
||||||
)
|
)
|
||||||
|
|
||||||
RETURN EXPECT(1, LENGTH(frames))
|
RETURN T::LEN(frames, 1)
|
||||||
@@ -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 page = DOCUMENT(url, true)
|
||||||
LET frames = (
|
LET frames = (
|
||||||
FOR f IN page.frames
|
FOR f IN page.frames
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic
|
LET url = @lab.cdn.dynamic
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
|
|
||||||
LET expected = `<head>
|
LET expected = `<head>
|
||||||
@@ -27,4 +27,4 @@ LET actual = INNER_HTML(doc)
|
|||||||
LET r1 = '(\s|\")'
|
LET r1 = '(\s|\")'
|
||||||
LET r2 = '(\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, ''))
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic
|
LET url = @lab.cdn.dynamic
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
LET selector = '#root > div > main > div'
|
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 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)
|
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', ''))
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic
|
LET url = @lab.cdn.dynamic
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
|
|
||||||
WAIT_ELEMENT(doc, "#layout")
|
WAIT_ELEMENT(doc, "#layout")
|
||||||
@@ -9,4 +9,4 @@ LET expected = [
|
|||||||
]
|
]
|
||||||
LET actual = INNER_HTML_ALL(doc, '#root > div > main > div > *')
|
LET actual = INNER_HTML_ALL(doc, '#root > div > main > div > *')
|
||||||
|
|
||||||
RETURN EXPECT(expected, actual)
|
RETURN T::EQ(actual, expected)
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic
|
LET url = @lab.cdn.dynamic
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
|
|
||||||
LET expected = `<span>Hello</span>`
|
LET expected = `<span>Hello</span>`
|
||||||
@@ -10,4 +10,4 @@ LET actual = INNER_HTML(doc, "body")
|
|||||||
LET r1 = '(\s|\")'
|
LET r1 = '(\s|\")'
|
||||||
LET r2 = '(\n|\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, ''))
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic
|
LET url = @lab.cdn.dynamic
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
|
|
||||||
LET expected = `Ferret
|
LET expected = `Ferret
|
||||||
@@ -14,4 +14,4 @@ LET actual = INNER_TEXT(doc)
|
|||||||
LET r1 = '(\n|\s)'
|
LET r1 = '(\n|\s)'
|
||||||
LET r2 = '(\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, ''))
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic
|
LET url = @lab.cdn.dynamic
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
LET selector = '#root > div > main > div h1'
|
LET selector = '#root > div > main > div h1'
|
||||||
|
|
||||||
@@ -7,4 +7,4 @@ WAIT_ELEMENT(doc, "#layout")
|
|||||||
LET expected = 'Welcome to Ferret E2E test page!'
|
LET expected = 'Welcome to Ferret E2E test page!'
|
||||||
LET actual = INNER_TEXT(doc, selector)
|
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', ''))
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic
|
LET url = @lab.cdn.dynamic
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
LET selector = '#root > div > main > div > *'
|
LET selector = '#root > div > main > div > *'
|
||||||
|
|
||||||
@@ -13,4 +13,4 @@ LET actual = (
|
|||||||
RETURN REGEXP_REPLACE(TRIM(str), '\n', '')
|
RETURN REGEXP_REPLACE(TRIM(str), '\n', '')
|
||||||
)
|
)
|
||||||
|
|
||||||
RETURN EXPECT(expected, actual)
|
RETURN T::EQ(actual, expected)
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic
|
LET url = @lab.cdn.dynamic
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
|
|
||||||
LET expected = `Hello`
|
LET expected = `Hello`
|
||||||
@@ -10,4 +10,4 @@ LET actual = INNER_TEXT(doc, "body")
|
|||||||
LET r1 = '(\s|\")'
|
LET r1 = '(\s|\")'
|
||||||
LET r2 = '(\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, ''))
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "?redirect=/forms"
|
LET url = @lab.cdn.dynamic + "?redirect=/forms"
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
|
|
||||||
WAIT_ELEMENT(doc, "form")
|
WAIT_ELEMENT(doc, "form")
|
||||||
@@ -7,4 +7,4 @@ LET output = ELEMENT(doc, "#text_output")
|
|||||||
|
|
||||||
INPUT(doc, "#text_input", "foo")
|
INPUT(doc, "#text_input", "foo")
|
||||||
|
|
||||||
RETURN EXPECT(output.innerText, "foo")
|
RETURN T::EQ(output.innerText, "foo")
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
LET url = @dynamic
|
LET url = @lab.cdn.dynamic
|
||||||
LET p = DOCUMENT("", { driver: "cdp" })
|
LET p = DOCUMENT("", { driver: "cdp" })
|
||||||
|
|
||||||
NAVIGATE(p, url)
|
NAVIGATE(p, url)
|
||||||
|
|
||||||
RETURN T::EXPECT(url + '/', p.url)
|
RETURN T::EQ(p.url, url + '/')
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "/#/pagination"
|
LET url = @lab.cdn.dynamic + "/#/pagination"
|
||||||
LET page = DOCUMENT(url, true)
|
LET page = DOCUMENT(url, true)
|
||||||
|
|
||||||
LET items = (
|
LET items = (
|
||||||
@@ -6,4 +6,4 @@ LET items = (
|
|||||||
RETURN i
|
RETURN i
|
||||||
)
|
)
|
||||||
|
|
||||||
RETURN EXPECT(5, LENGTH(items))
|
RETURN T::LEN(items, 5)
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "?redirect=/forms"
|
LET url = @lab.cdn.dynamic + "?redirect=/forms"
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
|
|
||||||
WAIT_ELEMENT(doc, "form")
|
WAIT_ELEMENT(doc, "form")
|
||||||
@@ -6,4 +6,7 @@ WAIT_ELEMENT(doc, "form")
|
|||||||
LET output = ELEMENT(doc, "#multi_select_output")
|
LET output = ELEMENT(doc, "#multi_select_output")
|
||||||
LET result = SELECT(doc, "#multi_select_input", ["1", "2", "4"])
|
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
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "?redirect=/forms"
|
LET url = @lab.cdn.dynamic + "?redirect=/forms"
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
|
|
||||||
WAIT_ELEMENT(doc, "form")
|
WAIT_ELEMENT(doc, "form")
|
||||||
@@ -6,4 +6,7 @@ WAIT_ELEMENT(doc, "form")
|
|||||||
LET output = ELEMENT(doc, "#select_output")
|
LET output = ELEMENT(doc, "#select_output")
|
||||||
LET result = SELECT(doc, "#select_input", ["4"])
|
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
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "?redirect=/media"
|
LET url = @lab.cdn.dynamic + "?redirect=/media"
|
||||||
LET expectedW = 1920
|
LET expectedW = 1920
|
||||||
LET expectedH = 1080
|
LET expectedH = 1080
|
||||||
|
|
||||||
@@ -13,4 +13,7 @@ LET doc = DOCUMENT(url, {
|
|||||||
LET actualW = TO_INT(INNER_TEXT(doc, '#screen-width'))
|
LET actualW = TO_INT(INNER_TEXT(doc, '#screen-width'))
|
||||||
LET actualH = TO_INT(INNER_TEXT(doc, '#screen-height'))
|
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
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "?redirect=/events"
|
LET url = @lab.cdn.dynamic + "?redirect=/events"
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
LET selector = "#wait-class-btn"
|
LET selector = "#wait-class-btn"
|
||||||
LET attrName = "data-ferret-x"
|
LET attrName = "data-ferret-x"
|
||||||
@@ -15,4 +15,7 @@ WAIT_ATTR(doc, selector, attrName, attrVal, 30000)
|
|||||||
|
|
||||||
LET curr = el.attributes
|
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
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "?redirect=/events"
|
LET url = @lab.cdn.dynamic + "?redirect=/events"
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
|
|
||||||
WAIT_ELEMENT(doc, "#page-events")
|
WAIT_ELEMENT(doc, "#page-events")
|
||||||
@@ -6,4 +6,4 @@ WAIT_ELEMENT(doc, "#page-events")
|
|||||||
CLICK_ALL(doc, "#wait-class-btn, #wait-class-random-btn")
|
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)
|
WAIT_ATTR_ALL(doc, "#wait-class-content, #wait-class-random-content", "class", "alert alert-success", 10000)
|
||||||
|
|
||||||
RETURN ""
|
RETURN NONE
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "?redirect=/events"
|
LET url = @lab.cdn.dynamic + "?redirect=/events"
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
|
|
||||||
WAIT_ELEMENT(doc, "#page-events")
|
WAIT_ELEMENT(doc, "#page-events")
|
||||||
@@ -11,4 +11,4 @@ WAIT_CLASS(doc, "#wait-class-content", "alert-success")
|
|||||||
CLICK(doc, "#wait-class-random-btn")
|
CLICK(doc, "#wait-class-random-btn")
|
||||||
WAIT_CLASS(doc, "#wait-class-random-content", "alert-success", 10000)
|
WAIT_CLASS(doc, "#wait-class-random-content", "alert-success", 10000)
|
||||||
|
|
||||||
RETURN ""
|
RETURN NONE
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "?redirect=/events"
|
LET url = @lab.cdn.dynamic + "?redirect=/events"
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
|
|
||||||
WAIT_ELEMENT(doc, "#page-events")
|
WAIT_ELEMENT(doc, "#page-events")
|
||||||
@@ -6,4 +6,4 @@ WAIT_ELEMENT(doc, "#page-events")
|
|||||||
CLICK_ALL(doc, "#wait-class-btn, #wait-class-random-btn")
|
CLICK_ALL(doc, "#wait-class-btn, #wait-class-random-btn")
|
||||||
WAIT_CLASS_ALL(doc, "#wait-class-content, #wait-class-random-content", "alert-success", 10000)
|
WAIT_CLASS_ALL(doc, "#wait-class-content, #wait-class-random-content", "alert-success", 10000)
|
||||||
|
|
||||||
RETURN ""
|
RETURN NONE
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "?redirect=/events"
|
LET url = @lab.cdn.dynamic + "?redirect=/events"
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
LET pageSelector = "#page-events"
|
LET pageSelector = "#page-events"
|
||||||
LET elemSelector = "#wait-element-content"
|
LET elemSelector = "#wait-element-content"
|
||||||
@@ -10,4 +10,6 @@ CLICK(doc, btnSelector)
|
|||||||
|
|
||||||
WAIT_ELEMENT(doc, elemSelector, 10000)
|
WAIT_ELEMENT(doc, elemSelector, 10000)
|
||||||
|
|
||||||
RETURN ELEMENT_EXISTS(doc, elemSelector) ? "" : "element not found"
|
T::TRUE(ELEMENT_EXISTS(doc, elemSelector), "element not found")
|
||||||
|
|
||||||
|
RETURN NONE
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "?redirect=/events"
|
LET url = @lab.cdn.dynamic + "?redirect=/events"
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
|
|
||||||
WAIT_ELEMENT(doc, "#page-events")
|
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")
|
CLICK(doc, "#wait-no-class-random-btn")
|
||||||
WAIT_NO_ATTR(doc, "#wait-no-class-random-content", "class", "alert alert-success", 10000)
|
WAIT_NO_ATTR(doc, "#wait-no-class-random-content", "class", "alert alert-success", 10000)
|
||||||
|
|
||||||
RETURN ""
|
RETURN NONE
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "?redirect=/events"
|
LET url = @lab.cdn.dynamic + "?redirect=/events"
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
|
|
||||||
WAIT_ELEMENT(doc, "#page-events")
|
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")
|
CLICK(doc, "#wait-no-class-random-btn")
|
||||||
WAIT_NO_CLASS(doc, "#wait-no-class-random-content", "alert-success", 10000)
|
WAIT_NO_CLASS(doc, "#wait-no-class-random-content", "alert-success", 10000)
|
||||||
|
|
||||||
RETURN ""
|
RETURN NONE
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "?redirect=/events"
|
LET url = @lab.cdn.dynamic + "?redirect=/events"
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
|
|
||||||
WAIT_ELEMENT(doc, "#page-events")
|
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")
|
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)
|
WAIT_NO_CLASS_ALL(doc, "#wait-no-class-content, #wait-no-class-random-content", "alert-success", 10000)
|
||||||
|
|
||||||
RETURN ""
|
RETURN NONE
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "?redirect=/events"
|
LET url = @lab.cdn.dynamic + "?redirect=/events"
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
LET pageSelector = "#page-events"
|
LET pageSelector = "#page-events"
|
||||||
LET elemSelector = "#wait-no-element-content"
|
LET elemSelector = "#wait-no-element-content"
|
||||||
@@ -10,4 +10,6 @@ CLICK(doc, btnSelector)
|
|||||||
|
|
||||||
WAIT_NO_ELEMENT(doc, elemSelector, 10000)
|
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
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "?redirect=/events"
|
LET url = @lab.cdn.dynamic + "?redirect=/events"
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
LET selector = "#wait-class-btn"
|
LET selector = "#wait-class-btn"
|
||||||
|
|
||||||
@@ -16,4 +16,7 @@ WAIT_NO_STYLE(doc, selector, "width", "100%")
|
|||||||
|
|
||||||
LET curr = el.style
|
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
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "?redirect=/events"
|
LET url = @lab.cdn.dynamic + "?redirect=/events"
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
LET selector = "#wait-class-btn, #wait-class-random-btn"
|
LET selector = "#wait-class-btn, #wait-class-random-btn"
|
||||||
|
|
||||||
@@ -27,4 +27,6 @@ LET results = (
|
|||||||
RETURN el.style.color
|
RETURN el.style.color
|
||||||
)
|
)
|
||||||
|
|
||||||
RETURN CONCAT(results) == "redred" ? "" : "styles should be updated"
|
T::EQ(CONCAT(results), "redred", "styles should be updated")
|
||||||
|
|
||||||
|
RETURN NONE
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "?redirect=/events"
|
LET url = @lab.cdn.dynamic + "?redirect=/events"
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
LET selector = "#wait-class-btn"
|
LET selector = "#wait-class-btn"
|
||||||
|
|
||||||
@@ -12,4 +12,7 @@ WAIT_STYLE(doc, selector, "width", "100%")
|
|||||||
|
|
||||||
LET curr = el.style
|
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
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "?redirect=/events"
|
LET url = @lab.cdn.dynamic + "?redirect=/events"
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
LET selector = "#wait-class-btn, #wait-class-random-btn"
|
LET selector = "#wait-class-btn, #wait-class-random-btn"
|
||||||
|
|
||||||
@@ -18,4 +18,6 @@ LET results = (
|
|||||||
RETURN el.style.color
|
RETURN el.style.color
|
||||||
)
|
)
|
||||||
|
|
||||||
RETURN CONCAT(results) == "blackblack" ? "" : "styles should be updated"
|
T::EQ(CONCAT(results), "blackblack", "styles should be updated")
|
||||||
|
|
||||||
|
RETURN NONE
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
LET url = @dynamic
|
LET url = @lab.cdn.dynamic
|
||||||
LET page = DOCUMENT(url, { driver: "cdp" })
|
LET page = DOCUMENT(url, { driver: "cdp" })
|
||||||
|
|
||||||
LET actual = XPATH(page, "//meta/@charset")
|
LET actual = XPATH(page, "//meta/@charset")
|
||||||
|
|
||||||
RETURN EXPECT(["utf-8"], actual)
|
RETURN T::EQ(actual, ["utf-8"])
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
LET url = @dynamic
|
LET url = @lab.cdn.dynamic
|
||||||
LET page = DOCUMENT(url, { driver: "cdp" })
|
LET page = DOCUMENT(url, { driver: "cdp" })
|
||||||
|
|
||||||
LET actual = XPATH(page, "count(//body)")
|
LET actual = XPATH(page, "count(//body)")
|
||||||
|
|
||||||
RETURN EXPECT(1, actual)
|
RETURN T::EQ(actual, 1)
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
LET url = @dynamic + "?redirect=/forms"
|
LET url = @lab.cdn.dynamic + "?redirect=/forms"
|
||||||
LET page = DOCUMENT(url, { driver: "cdp" })
|
LET page = DOCUMENT(url, { driver: "cdp" })
|
||||||
|
|
||||||
LET actual = XPATH(page, "//div[contains(@class, 'form-group')]")
|
LET actual = XPATH(page, "//div[contains(@class, 'form-group')]")
|
||||||
|
|
||||||
RETURN EXPECT(4, LENGTH(actual))
|
RETURN T::LEN(actual, 4)
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic
|
LET url = @lab.cdn.dynamic
|
||||||
LET doc = DOCUMENT(url, { driver: "cdp" })
|
LET doc = DOCUMENT(url, { driver: "cdp" })
|
||||||
|
|
||||||
LET el = ELEMENT(doc, "#index")
|
LET el = ELEMENT(doc, "#index")
|
||||||
@@ -10,4 +10,6 @@ LET attrs = [
|
|||||||
LET expected = '["jumbotron","page"]'
|
LET expected = '["jumbotron","page"]'
|
||||||
LET actual = TO_STRING(attrs)
|
LET actual = TO_STRING(attrs)
|
||||||
|
|
||||||
RETURN EXPECT(expected, actual)
|
T::EQ(actual, expected)
|
||||||
|
|
||||||
|
RETURN NONE
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "?redirect=/events"
|
LET url = @lab.cdn.dynamic + "?redirect=/events"
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
LET pageSelector = "#page-events"
|
LET pageSelector = "#page-events"
|
||||||
LET elemSelector = "#wait-no-style-content"
|
LET elemSelector = "#wait-no-style-content"
|
||||||
@@ -8,4 +8,6 @@ WAIT_ELEMENT(doc, pageSelector)
|
|||||||
LET el = ELEMENT(doc, elemSelector)
|
LET el = ELEMENT(doc, elemSelector)
|
||||||
LET attrs = ATTR_GET(el, "style")
|
LET attrs = ATTR_GET(el, "style")
|
||||||
|
|
||||||
RETURN EXPECT("display: block;", attrs.style)
|
T::EQ(attrs.style, "display: block;")
|
||||||
|
|
||||||
|
RETURN NONE
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "?redirect=/events"
|
LET url = @lab.cdn.dynamic + "?redirect=/events"
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
LET pageSelector = "#page-events"
|
LET pageSelector = "#page-events"
|
||||||
LET elemSelector = "#wait-no-style-content"
|
LET elemSelector = "#wait-no-style-content"
|
||||||
@@ -14,4 +14,7 @@ WAIT(1000)
|
|||||||
|
|
||||||
LET curr = el.attributes.style
|
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
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "?redirect=/events"
|
LET url = @lab.cdn.dynamic + "?redirect=/events"
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
LET pageSelector = "#page-events"
|
LET pageSelector = "#page-events"
|
||||||
LET elemSelector = "#wait-no-style-content"
|
LET elemSelector = "#wait-no-style-content"
|
||||||
@@ -14,4 +14,6 @@ WAIT(1000)
|
|||||||
|
|
||||||
LET curr = el.style
|
LET curr = el.style
|
||||||
|
|
||||||
RETURN curr.color == "black" ? "" : "styles should be updated"
|
T::EQ(curr.color, "black", "styles should be updated")
|
||||||
|
|
||||||
|
RETURN NONE
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "?redirect=/events"
|
LET url = @lab.cdn.dynamic + "?redirect=/events"
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
LET pageSelector = "#page-events"
|
LET pageSelector = "#page-events"
|
||||||
LET elemSelector = "#wait-no-style-content"
|
LET elemSelector = "#wait-no-style-content"
|
||||||
@@ -11,4 +11,7 @@ ATTR_SET(el, { style: "color: black;", "data-ferret-x": "test" })
|
|||||||
|
|
||||||
WAIT(1000)
|
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
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "/#/events"
|
LET url = @lab.cdn.dynamic + "/#/events"
|
||||||
LET page = DOCUMENT(url, true)
|
LET page = DOCUMENT(url, true)
|
||||||
|
|
||||||
LET input = ELEMENT(page, "#focus-input")
|
LET input = ELEMENT(page, "#focus-input")
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "/#/events"
|
LET url = @lab.cdn.dynamic + "/#/events"
|
||||||
LET page = DOCUMENT(url, true)
|
LET page = DOCUMENT(url, true)
|
||||||
|
|
||||||
FOCUS(page, "#focus-input")
|
FOCUS(page, "#focus-input")
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "?redirect=/forms"
|
LET url = @lab.cdn.dynamic + "?redirect=/forms"
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
|
|
||||||
WAIT_ELEMENT(doc, "form")
|
WAIT_ELEMENT(doc, "form")
|
||||||
@@ -9,4 +9,6 @@ INPUT(input, "Foo", 100)
|
|||||||
|
|
||||||
INPUT_CLEAR(input)
|
INPUT_CLEAR(input)
|
||||||
|
|
||||||
RETURN EXPECT("", INNER_TEXT(doc, "#text_output"))
|
T::EMPTY(INNER_TEXT(doc, "#text_output"))
|
||||||
|
|
||||||
|
RETURN NONE
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "?redirect=/forms"
|
LET url = @lab.cdn.dynamic + "?redirect=/forms"
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
|
|
||||||
WAIT_ELEMENT(doc, "form")
|
WAIT_ELEMENT(doc, "form")
|
||||||
@@ -11,4 +11,6 @@ INPUT_CLEAR(form, "#text_input")
|
|||||||
LET input = ELEMENT(doc, "#text_input")
|
LET input = ELEMENT(doc, "#text_input")
|
||||||
LET output = ELEMENT(doc, "#text_output")
|
LET output = ELEMENT(doc, "#text_output")
|
||||||
|
|
||||||
RETURN EXPECT("", output.innerText)
|
T::EMPTY(output.innerText)
|
||||||
|
|
||||||
|
RETURN NONE
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "/#/events"
|
LET url = @lab.cdn.dynamic + "/#/events"
|
||||||
LET page = DOCUMENT(url, true)
|
LET page = DOCUMENT(url, true)
|
||||||
|
|
||||||
LET btn = ELEMENT(page, "#wait-class-random-btn")
|
LET btn = ELEMENT(page, "#wait-class-random-btn")
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "/#/events"
|
LET url = @lab.cdn.dynamic + "/#/events"
|
||||||
LET page = DOCUMENT(url, true)
|
LET page = DOCUMENT(url, true)
|
||||||
|
|
||||||
LET div = ELEMENT(page, "#wait-class-random")
|
LET div = ELEMENT(page, "#wait-class-random")
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "/#/forms"
|
LET url = @lab.cdn.dynamic + "/#/forms"
|
||||||
LET page = DOCUMENT(url, true)
|
LET page = DOCUMENT(url, true)
|
||||||
|
|
||||||
WAIT_ELEMENT(page, "form")
|
WAIT_ELEMENT(page, "form")
|
||||||
@@ -13,4 +13,4 @@ INPUT(input, "Bar")
|
|||||||
|
|
||||||
WAIT(100)
|
WAIT(100)
|
||||||
|
|
||||||
RETURN EXPECT("Bar", input.value)
|
RETURN T::EQ(input.value, "Bar")
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "/#/forms"
|
LET url = @lab.cdn.dynamic + "/#/forms"
|
||||||
LET page = DOCUMENT(url, true)
|
LET page = DOCUMENT(url, true)
|
||||||
|
|
||||||
WAIT_ELEMENT(page, "form")
|
WAIT_ELEMENT(page, "form")
|
||||||
@@ -13,4 +13,4 @@ INPUT(input, "Bar")
|
|||||||
|
|
||||||
WAIT(100)
|
WAIT(100)
|
||||||
|
|
||||||
RETURN EXPECT("Bar", input.value)
|
RETURN T::EQ(input.value, "Bar")
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "/#/events"
|
LET url = @lab.cdn.dynamic + "/#/events"
|
||||||
LET page = DOCUMENT(url, true)
|
LET page = DOCUMENT(url, true)
|
||||||
|
|
||||||
LET input = ELEMENT(page, "#focus-input")
|
LET input = ELEMENT(page, "#focus-input")
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "/#/events"
|
LET url = @lab.cdn.dynamic + "/#/events"
|
||||||
LET page = DOCUMENT(url, true)
|
LET page = DOCUMENT(url, true)
|
||||||
|
|
||||||
FOCUS(page, "#focus-input")
|
FOCUS(page, "#focus-input")
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "?redirect=/events"
|
LET url = @lab.cdn.dynamic + "?redirect=/events"
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
|
|
||||||
WAIT_ELEMENT(doc, "#page-events")
|
WAIT_ELEMENT(doc, "#page-events")
|
||||||
@@ -10,4 +10,4 @@ WAIT_ELEMENT(doc, "#hoverable-content")
|
|||||||
|
|
||||||
LET output = 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.")
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "?redirect=/events"
|
LET url = @lab.cdn.dynamic + "?redirect=/events"
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
|
|
||||||
WAIT_ELEMENT(doc, "#page-events")
|
WAIT_ELEMENT(doc, "#page-events")
|
||||||
@@ -8,4 +8,4 @@ WAIT_ELEMENT(doc, "#hoverable-content")
|
|||||||
|
|
||||||
LET output = INNER_TEXT(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.")
|
||||||
@@ -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 page = DOCUMENT(url, { driver: 'cdp' })
|
||||||
LET doc = page.frames[1]
|
LET doc = page.frames[1]
|
||||||
|
|
||||||
WAIT_ELEMENT(doc, "#page-events")
|
WAIT_ELEMENT(doc, "#page-events", 5000)
|
||||||
|
|
||||||
LET input = ELEMENT(doc, "#hoverable-btn")
|
LET input = ELEMENT(doc, "#hoverable-btn")
|
||||||
|
|
||||||
@@ -11,4 +11,4 @@ WAIT_ELEMENT(doc, "#hoverable-content")
|
|||||||
|
|
||||||
LET output = 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.")
|
||||||
@@ -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 page = DOCUMENT(url, { driver: 'cdp' })
|
||||||
LET doc = page.frames[1]
|
LET doc = page.frames[1]
|
||||||
|
|
||||||
@@ -9,4 +9,4 @@ LET output = ELEMENT(doc, "#text_output")
|
|||||||
|
|
||||||
INPUT(input, "foo")
|
INPUT(input, "foo")
|
||||||
|
|
||||||
RETURN EXPECT(output.innerText, "foo")
|
RETURN T::EQ(output.innerText, "foo")
|
||||||
@@ -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 page = DOCUMENT(url, { driver: 'cdp' })
|
||||||
LET doc = page.frames[1]
|
LET doc = page.frames[1]
|
||||||
|
|
||||||
@@ -8,4 +8,7 @@ LET input = ELEMENT(doc, "#select_input")
|
|||||||
LET output = ELEMENT(doc, "#select_output")
|
LET output = ELEMENT(doc, "#select_output")
|
||||||
LET result = SELECT(input, ["4"])
|
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
|
||||||
@@ -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 page = DOCUMENT(url, { driver: 'cdp' })
|
||||||
LET doc = page.frames[1]
|
LET doc = page.frames[1]
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic
|
LET url = @lab.cdn.dynamic
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
LET el = ELEMENT(doc, "#root")
|
LET el = ELEMENT(doc, "#root")
|
||||||
|
|
||||||
@@ -8,4 +8,4 @@ LET actual = INNER_HTML(el)
|
|||||||
LET r1 = '(\s|\")'
|
LET r1 = '(\s|\")'
|
||||||
LET r2 = '(\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, ''))
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "/#/lists"
|
LET url = @lab.cdn.dynamic + "/#/lists"
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
|
|
||||||
LET expected = [
|
LET expected = [
|
||||||
@@ -31,4 +31,4 @@ LET actual = (
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
RETURN EXPECT(expected, actual)
|
RETURN T::EQ(actual, expected)
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic
|
LET url = @lab.cdn.dynamic
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
LET el = ELEMENT(doc, ".jumbotron")
|
LET el = ELEMENT(doc, ".jumbotron")
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic
|
LET url = @lab.cdn.dynamic
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
LET el = ELEMENT(doc, "#index")
|
LET el = ELEMENT(doc, "#index")
|
||||||
|
|
||||||
@@ -11,4 +11,4 @@ WAIT(100)
|
|||||||
LET r1 = '(\s|\")'
|
LET r1 = '(\s|\")'
|
||||||
LET r2 = '(\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, ''))
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "/#/lists"
|
LET url = @lab.cdn.dynamic + "/#/lists"
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
|
|
||||||
LET expected = [
|
LET expected = [
|
||||||
@@ -22,4 +22,4 @@ LET actual = (
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
RETURN EXPECT(expected, actual)
|
RETURN T::EQ(actual, expected)
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic
|
LET url = @lab.cdn.dynamic
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
LET el = ELEMENT(doc, ".jumbotron")
|
LET el = ELEMENT(doc, ".jumbotron")
|
||||||
|
|
||||||
@@ -11,4 +11,4 @@ LET actual = INNER_TEXT(el)
|
|||||||
LET r1 = '(\n|\s)'
|
LET r1 = '(\n|\s)'
|
||||||
LET r2 = '(\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, ''))
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "/#/lists"
|
LET url = @lab.cdn.dynamic + "/#/lists"
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
|
|
||||||
LET expected = [
|
LET expected = [
|
||||||
@@ -31,4 +31,4 @@ LET actual = (
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
RETURN EXPECT(expected, actual)
|
RETURN T::EQ(actual, expected)
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic
|
LET url = @lab.cdn.dynamic
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
LET el = ELEMENT(doc, ".jumbotron")
|
LET el = ELEMENT(doc, ".jumbotron")
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic
|
LET url = @lab.cdn.dynamic
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
LET el = ELEMENT(doc, ".jumbotron")
|
LET el = ELEMENT(doc, ".jumbotron")
|
||||||
|
|
||||||
@@ -10,4 +10,4 @@ LET actual = INNER_TEXT(el)
|
|||||||
LET r1 = '(\n|\s)'
|
LET r1 = '(\n|\s)'
|
||||||
LET r2 = '(\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, ''))
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic
|
LET url = @lab.cdn.dynamic
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
LET el = ELEMENT(doc, ".jumbotron")
|
LET el = ELEMENT(doc, ".jumbotron")
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "/#/lists"
|
LET url = @lab.cdn.dynamic + "/#/lists"
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
|
|
||||||
LET expected = [
|
LET expected = [
|
||||||
@@ -34,4 +34,4 @@ LET actual = (
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
RETURN EXPECT(expected, actual)
|
RETURN T::EQ(actual, expected)
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "?redirect=/forms"
|
LET url = @lab.cdn.dynamic + "?redirect=/forms"
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
|
|
||||||
WAIT_ELEMENT(doc, "form")
|
WAIT_ELEMENT(doc, "form")
|
||||||
@@ -8,4 +8,4 @@ LET output = ELEMENT(doc, "#text_output")
|
|||||||
|
|
||||||
INPUT(input, "foo")
|
INPUT(input, "foo")
|
||||||
|
|
||||||
RETURN EXPECT(output.innerText, "foo")
|
RETURN T::EQ(output.innerText, "foo")
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "?redirect=/forms"
|
LET url = @lab.cdn.dynamic + "?redirect=/forms"
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
|
|
||||||
WAIT_ELEMENT(doc, "form")
|
WAIT_ELEMENT(doc, "form")
|
||||||
@@ -9,4 +9,4 @@ INPUT(form, "#text_input", "foo")
|
|||||||
|
|
||||||
LET output = ELEMENT(doc, "#text_output")
|
LET output = ELEMENT(doc, "#text_output")
|
||||||
|
|
||||||
RETURN EXPECT(output.innerText, "foo")
|
RETURN T::EQ(output.innerText, "foo")
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "?redirect=/forms"
|
LET url = @lab.cdn.dynamic + "?redirect=/forms"
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
|
|
||||||
WAIT_ELEMENT(doc, "form")
|
WAIT_ELEMENT(doc, "form")
|
||||||
@@ -9,4 +9,4 @@ INPUT(form, "#text_input", "foo", 100)
|
|||||||
|
|
||||||
LET output = ELEMENT(doc, "#text_output")
|
LET output = ELEMENT(doc, "#text_output")
|
||||||
|
|
||||||
RETURN EXPECT(output.innerText, "foo")
|
RETURN T::EQ(output.innerText, "foo")
|
||||||
9
e2e/tests/dynamic/element/query/exists.fql
Normal file
9
e2e/tests/dynamic/element/query/exists.fql
Normal 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
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "?redirect=/forms"
|
LET url = @lab.cdn.dynamic + "?redirect=/forms"
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
|
|
||||||
WAIT_ELEMENT(doc, "form")
|
WAIT_ELEMENT(doc, "form")
|
||||||
@@ -7,4 +7,7 @@ LET input = ELEMENT(doc, "#multi_select_input")
|
|||||||
LET output = ELEMENT(doc, "#multi_select_output")
|
LET output = ELEMENT(doc, "#multi_select_output")
|
||||||
LET result = SELECT(input, ["1", "2", "4"])
|
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
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "?redirect=/forms"
|
LET url = @lab.cdn.dynamic + "?redirect=/forms"
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
|
|
||||||
WAIT_ELEMENT(doc, "form")
|
WAIT_ELEMENT(doc, "form")
|
||||||
@@ -7,4 +7,7 @@ LET input = ELEMENT(doc, "#select_input")
|
|||||||
LET output = ELEMENT(doc, "#select_output")
|
LET output = ELEMENT(doc, "#select_output")
|
||||||
LET result = SELECT(input, ["4"])
|
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
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "?redirect=/events"
|
LET url = @lab.cdn.dynamic + "?redirect=/events"
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
LET pageSelector = "#page-events"
|
LET pageSelector = "#page-events"
|
||||||
LET elemSelector = "#wait-no-style-content"
|
LET elemSelector = "#wait-no-style-content"
|
||||||
@@ -8,4 +8,6 @@ WAIT_ELEMENT(doc, pageSelector)
|
|||||||
LET el = ELEMENT(doc, elemSelector)
|
LET el = ELEMENT(doc, elemSelector)
|
||||||
LET val = STYLE_GET(el, "display")
|
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
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "?redirect=/events"
|
LET url = @lab.cdn.dynamic + "?redirect=/events"
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
LET pageSelector = "#page-events"
|
LET pageSelector = "#page-events"
|
||||||
LET elemSelector = "#wait-no-style-content"
|
LET elemSelector = "#wait-no-style-content"
|
||||||
@@ -14,4 +14,7 @@ WAIT(1000)
|
|||||||
|
|
||||||
LET curr = el.style
|
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
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "?redirect=/events"
|
LET url = @lab.cdn.dynamic + "?redirect=/events"
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
LET pageSelector = "#page-events"
|
LET pageSelector = "#page-events"
|
||||||
LET elemSelector = "#wait-no-style-content"
|
LET elemSelector = "#wait-no-style-content"
|
||||||
@@ -14,4 +14,6 @@ WAIT(1000)
|
|||||||
|
|
||||||
LET curr = el.style
|
LET curr = el.style
|
||||||
|
|
||||||
RETURN curr.color == "black" ? "" : "styles should be updated"
|
T::EQ(curr.color, "black", "styles should be updated")
|
||||||
|
|
||||||
|
RETURN NONE
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "?redirect=/events"
|
LET url = @lab.cdn.dynamic + "?redirect=/events"
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
LET pageSelector = "#page-events"
|
LET pageSelector = "#page-events"
|
||||||
LET elemSelector = "#wait-no-style-content"
|
LET elemSelector = "#wait-no-style-content"
|
||||||
@@ -14,4 +14,8 @@ WAIT(1000)
|
|||||||
|
|
||||||
LET curr = el.style
|
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
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "?redirect=/forms"
|
LET url = @lab.cdn.dynamic + "?redirect=/forms"
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
|
|
||||||
LET el = ELEMENT(doc, "#select_input")
|
LET el = ELEMENT(doc, "#select_input")
|
||||||
@@ -6,4 +6,6 @@ LET el = ELEMENT(doc, "#select_input")
|
|||||||
LET expected = "1"
|
LET expected = "1"
|
||||||
LET actual = el.value
|
LET actual = el.value
|
||||||
|
|
||||||
RETURN EXPECT(actual, expected)
|
T::EQ(actual, expected)
|
||||||
|
|
||||||
|
RETURN NONE
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "?redirect=/events"
|
LET url = @lab.cdn.dynamic + "?redirect=/events"
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
|
|
||||||
WAIT_ELEMENT(doc, "#page-events")
|
WAIT_ELEMENT(doc, "#page-events")
|
||||||
@@ -17,4 +17,4 @@ LET c2 = ELEMENT(doc, "#wait-class-random-content")
|
|||||||
CLICK(b2)
|
CLICK(b2)
|
||||||
WAIT_ATTR(c2, "class", "alert alert-success", 10000)
|
WAIT_ATTR(c2, "class", "alert alert-success", 10000)
|
||||||
|
|
||||||
RETURN ""
|
RETURN NONE
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "?redirect=/events"
|
LET url = @lab.cdn.dynamic + "?redirect=/events"
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
|
|
||||||
WAIT_ELEMENT(doc, "#page-events")
|
WAIT_ELEMENT(doc, "#page-events")
|
||||||
@@ -11,4 +11,6 @@ WAIT_ATTR(el, "data-test", "test")
|
|||||||
ATTR_REMOVE(el, "class")
|
ATTR_REMOVE(el, "class")
|
||||||
WAIT_ATTR(el, "class", NONE)
|
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
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "?redirect=/events"
|
LET url = @lab.cdn.dynamic + "?redirect=/events"
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
|
|
||||||
WAIT_ELEMENT(doc, "#page-events")
|
WAIT_ELEMENT(doc, "#page-events")
|
||||||
@@ -17,4 +17,4 @@ LET c2 = ELEMENT(doc, "#wait-class-random-content")
|
|||||||
CLICK(b2)
|
CLICK(b2)
|
||||||
WAIT_CLASS(c2, "alert-success", 10000)
|
WAIT_CLASS(c2, "alert-success", 10000)
|
||||||
|
|
||||||
RETURN ""
|
RETURN NONE
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "?redirect=/events"
|
LET url = @lab.cdn.dynamic + "?redirect=/events"
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
|
|
||||||
WAIT_ELEMENT(doc, "#page-events")
|
WAIT_ELEMENT(doc, "#page-events")
|
||||||
@@ -17,4 +17,4 @@ LET c2 = ELEMENT(doc, "#wait-no-class-random-content")
|
|||||||
CLICK(b2)
|
CLICK(b2)
|
||||||
WAIT_NO_ATTR(c2, "class", "alert alert-success", 10000)
|
WAIT_NO_ATTR(c2, "class", "alert alert-success", 10000)
|
||||||
|
|
||||||
RETURN ""
|
RETURN NONE
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
LET url = @dynamic + "?redirect=/events"
|
LET url = @lab.cdn.dynamic + "?redirect=/events"
|
||||||
LET doc = DOCUMENT(url, true)
|
LET doc = DOCUMENT(url, true)
|
||||||
|
|
||||||
WAIT_ELEMENT(doc, "#page-events")
|
WAIT_ELEMENT(doc, "#page-events")
|
||||||
@@ -17,4 +17,4 @@ LET c2 = ELEMENT(doc, "#wait-no-class-random-content")
|
|||||||
CLICK(b2)
|
CLICK(b2)
|
||||||
WAIT_NO_CLASS(c2, "alert-success", 10000)
|
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
Reference in New Issue
Block a user