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:
parent
ad24814efd
commit
2643321e0f
12
.travis.yml
12
.travis.yml
@ -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:
|
||||
|
3
Makefile
3
Makefile
@ -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}/...
|
||||
|
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, {
|
||||
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
|
@ -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
|
@ -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)
|
@ -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)
|
@ -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)
|
@ -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)
|
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)
|
||||
|
||||
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 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
|
@ -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.")
|
@ -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")
|
@ -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)
|
@ -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)
|
@ -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
|
||||
|
@ -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, ''))
|
@ -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', ''))
|
@ -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)
|
@ -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, ''))
|
@ -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, ''))
|
@ -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', ''))
|
@ -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)
|
@ -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, ''))
|
@ -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")
|
@ -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 + '/')
|
@ -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)
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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"])
|
@ -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)
|
@ -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)
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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")
|
||||
|
@ -1,4 +1,4 @@
|
||||
LET url = @dynamic + "/#/events"
|
||||
LET url = @lab.cdn.dynamic + "/#/events"
|
||||
LET page = DOCUMENT(url, true)
|
||||
|
||||
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)
|
||||
|
||||
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
|
@ -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
|
@ -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")
|
||||
|
@ -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")
|
||||
|
@ -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")
|
@ -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")
|
@ -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")
|
||||
|
@ -1,4 +1,4 @@
|
||||
LET url = @dynamic + "/#/events"
|
||||
LET url = @lab.cdn.dynamic + "/#/events"
|
||||
LET page = DOCUMENT(url, true)
|
||||
|
||||
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)
|
||||
|
||||
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.")
|
@ -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.")
|
@ -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.")
|
@ -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")
|
@ -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
|
@ -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]
|
||||
|
||||
|
@ -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, ''))
|
@ -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)
|
@ -1,4 +1,4 @@
|
||||
LET url = @dynamic
|
||||
LET url = @lab.cdn.dynamic
|
||||
LET doc = DOCUMENT(url, true)
|
||||
LET el = ELEMENT(doc, ".jumbotron")
|
||||
|
||||
|
@ -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, ''))
|
@ -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)
|
@ -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, ''))
|
@ -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)
|
@ -1,4 +1,4 @@
|
||||
LET url = @dynamic
|
||||
LET url = @lab.cdn.dynamic
|
||||
LET doc = DOCUMENT(url, true)
|
||||
LET el = ELEMENT(doc, ".jumbotron")
|
||||
|
||||
|
@ -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, ''))
|
@ -1,4 +1,4 @@
|
||||
LET url = @dynamic
|
||||
LET url = @lab.cdn.dynamic
|
||||
LET doc = DOCUMENT(url, true)
|
||||
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 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)
|
||||
|
||||
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")
|
@ -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")
|
@ -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")
|
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)
|
||||
|
||||
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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
Loading…
x
Reference in New Issue
Block a user