How to use IsMap method of html Package

Best K6 code snippet using html.IsMap

wrp.go

Source:wrp.go Github

copy

Full Screen

1//2// WRP - Web Rendering Proxy3//4// Copyright (c) 2013-2018 Antoni Sawicki5// Copyright (c) 2019-2021 Google LLC6//7//go:generate statik -f -src=. -include=wrp.html8package main9import (10 "bytes"11 "context"12 "flag"13 "fmt"14 "html/template"15 "image"16 "image/gif"17 "image/png"18 "io/ioutil"19 "log"20 "math"21 "math/rand"22 "net/http"23 "net/url"24 "os"25 "os/signal"26 "strconv"27 "strings"28 "syscall"29 "time"30 "github.com/MaxHalford/halfgone"31 "github.com/chromedp/cdproto/css"32 "github.com/chromedp/cdproto/emulation"33 "github.com/chromedp/cdproto/page"34 "github.com/chromedp/chromedp"35 "github.com/ericpauley/go-quantize/quantize"36 "github.com/rakyll/statik/fs"37 _ "github.com/tenox7/wrp/statik"38)39var (40 version = "4.5.2"41 srv http.Server42 ctx context.Context43 cancel context.CancelFunc44 img = make(map[string]bytes.Buffer)45 ismap = make(map[string]wrpReq)46 noDel bool47 defType string48 defGeom geom49 htmlTmpl *template.Template50)51type geom struct {52 w int6453 h int6454 c int6455}56// Data for html template57type uiData struct {58 Version string59 URL string60 BgColor string61 NColors int6462 Width int6463 Height int6464 Zoom float6465 ImgType string66 ImgURL string67 ImgSize string68 ImgWidth int69 ImgHeight int70 MapURL string71 PageHeight string72}73// Parameters for HTML print function74type printParams struct {75 bgColor string76 pageHeight string77 imgSize string78 imgURL string79 mapURL string80 imgWidth int81 imgHeight int82}83// WRP Request84type wrpReq struct {85 url string // url86 width int64 // width87 height int64 // height88 zoom float64 // zoom/scale89 colors int64 // #colors90 mouseX int64 // mouseX91 mouseY int64 // mouseY92 keys string // keys to send93 buttons string // Fn buttons94 imgType string // imgtype95 out http.ResponseWriter96 req *http.Request97}98// Parse HTML Form, Process Input Boxes, Etc.99func parseForm(w *wrpReq) {100 w.req.ParseForm()101 w.url = w.req.FormValue("url")102 if len(w.url) > 1 && !strings.HasPrefix(w.url, "http") {103 w.url = fmt.Sprintf("http://www.google.com/search?q=%s", url.QueryEscape(w.url))104 }105 w.width, _ = strconv.ParseInt(w.req.FormValue("w"), 10, 64)106 w.height, _ = strconv.ParseInt(w.req.FormValue("h"), 10, 64)107 if w.width < 10 && w.height < 10 {108 w.width = defGeom.w109 w.height = defGeom.h110 }111 w.zoom, _ = strconv.ParseFloat(w.req.FormValue("z"), 64)112 if w.zoom < 0.1 {113 w.zoom = 1.0114 }115 w.colors, _ = strconv.ParseInt(w.req.FormValue("c"), 10, 64)116 if w.colors < 2 || w.colors > 256 {117 w.colors = defGeom.c118 }119 w.keys = w.req.FormValue("k")120 w.buttons = w.req.FormValue("Fn")121 w.imgType = w.req.FormValue("t")122 if w.imgType != "gif" && w.imgType != "png" {123 w.imgType = defType124 }125 log.Printf("%s WrpReq from UI Form: %+v\n", w.req.RemoteAddr, w)126}127// Display WP UI128func printHTML(w wrpReq, p printParams) {129 w.out.Header().Set("Cache-Control", "max-age=0")130 w.out.Header().Set("Expires", "-1")131 w.out.Header().Set("Pragma", "no-cache")132 w.out.Header().Set("Content-Type", "text/html")133 data := uiData{134 Version: version,135 URL: w.url,136 BgColor: p.bgColor,137 Width: w.width,138 Height: w.height,139 NColors: w.colors,140 Zoom: w.zoom,141 ImgType: w.imgType,142 ImgSize: p.imgSize,143 ImgWidth: p.imgWidth,144 ImgHeight: p.imgHeight,145 ImgURL: p.imgURL,146 MapURL: p.mapURL,147 PageHeight: p.pageHeight,148 }149 err := htmlTmpl.Execute(w.out, data)150 if err != nil {151 log.Fatal(err)152 }153}154// Determine what action to take155func action(w wrpReq) chromedp.Action {156 // Mouse Click157 if w.mouseX > 0 && w.mouseY > 0 {158 log.Printf("%s Mouse Click %d,%d\n", w.req.RemoteAddr, w.mouseX, w.mouseY)159 return chromedp.MouseClickXY(float64(w.mouseX)/float64(w.zoom), float64(w.mouseY)/float64(w.zoom))160 }161 // Buttons162 if len(w.buttons) > 0 {163 log.Printf("%s Button %v\n", w.req.RemoteAddr, w.buttons)164 switch w.buttons {165 case "Bk":166 return chromedp.NavigateBack()167 case "St":168 return chromedp.Stop()169 case "Re":170 return chromedp.Reload()171 case "Bs":172 return chromedp.KeyEvent("\b")173 case "Rt":174 return chromedp.KeyEvent("\r")175 case "<":176 return chromedp.KeyEvent("\u0302")177 case "^":178 return chromedp.KeyEvent("\u0304")179 case "v":180 return chromedp.KeyEvent("\u0301")181 case ">":182 return chromedp.KeyEvent("\u0303")183 }184 }185 // Keys186 if len(w.keys) > 0 {187 log.Printf("%s Sending Keys: %#v\n", w.req.RemoteAddr, w.keys)188 return chromedp.KeyEvent(w.keys)189 }190 // Navigate to URL191 log.Printf("%s Processing Capture Request for %s\n", w.req.RemoteAddr, w.url)192 return chromedp.Navigate(w.url)193}194// Process Keyboard and Mouse events or Navigate to the desired URL.195func navigate(w wrpReq) {196 err := chromedp.Run(ctx, action(w))197 if err != nil {198 if err.Error() == "context canceled" {199 log.Printf("%s Contex cancelled, try again", w.req.RemoteAddr)200 fmt.Fprintf(w.out, "<BR>%s<BR> -- restarting, try again", err)201 ctx, cancel = chromedp.NewContext(context.Background())202 return203 }204 log.Printf("%s %s", w.req.RemoteAddr, err)205 fmt.Fprintf(w.out, "<BR>%s<BR>", err)206 }207}208// Capture currently rendered web page to an image and fake ISMAP209func capture(w wrpReq) {210 var err error211 var styles []*css.ComputedStyleProperty212 var r, g, b int213 var h int64214 var pngcap []byte215 chromedp.Run(ctx,216 emulation.SetDeviceMetricsOverride(int64(float64(w.width)/w.zoom), 10, w.zoom, false),217 chromedp.Location(&w.url),218 chromedp.ComputedStyle("body", &styles, chromedp.ByQuery),219 chromedp.ActionFunc(func(ctx context.Context) error {220 _, _, s, err := page.GetLayoutMetrics().Do(ctx)221 if err == nil {222 h = int64(math.Ceil(s.Height))223 }224 return nil225 }),226 )227 for _, style := range styles {228 if style.Name == "background-color" {229 fmt.Sscanf(style.Value, "rgb(%d,%d,%d)", &r, &g, &b)230 }231 }232 log.Printf("%s Landed on: %s, Height: %v\n", w.req.RemoteAddr, w.url, h)233 height := int64(float64(w.height) / w.zoom)234 if w.height == 0 && h > 0 {235 height = h + 30236 }237 chromedp.Run(ctx, emulation.SetDeviceMetricsOverride(int64(float64(w.width)/w.zoom), height, w.zoom, false))238 // Capture screenshot...239 err = chromedp.Run(ctx,240 chromedp.Sleep(time.Second*2),241 chromedp.CaptureScreenshot(&pngcap),242 )243 if err != nil {244 if err.Error() == "context canceled" {245 log.Printf("%s Contex cancelled, try again", w.req.RemoteAddr)246 fmt.Fprintf(w.out, "<BR>%s<BR> -- restarting, try again", err)247 ctx, cancel = chromedp.NewContext(context.Background())248 return249 }250 log.Printf("%s Failed to capture screenshot: %s\n", w.req.RemoteAddr, err)251 fmt.Fprintf(w.out, "<BR>Unable to capture screenshot:<BR>%s<BR>\n", err)252 return253 }254 seq := rand.Intn(9999)255 imgpath := fmt.Sprintf("/img/%04d.%s", seq, w.imgType)256 mappath := fmt.Sprintf("/map/%04d.map", seq)257 ismap[mappath] = w258 var ssize string259 var iw, ih int260 switch w.imgType {261 case "gif":262 i, err := png.Decode(bytes.NewReader(pngcap))263 if err != nil {264 log.Printf("%s Failed to decode screenshot: %s\n", w.req.RemoteAddr, err)265 fmt.Fprintf(w.out, "<BR>Unable to decode page screenshot:<BR>%s<BR>\n", err)266 return267 }268 if w.colors == 2 {269 gray := halfgone.ImageToGray(i)270 i = halfgone.FloydSteinbergDitherer{}.Apply(gray)271 }272 var gifbuf bytes.Buffer273 err = gif.Encode(&gifbuf, i, &gif.Options{NumColors: int(w.colors), Quantizer: quantize.MedianCutQuantizer{}})274 if err != nil {275 log.Printf("%s Failed to encode GIF: %s\n", w.req.RemoteAddr, err)276 fmt.Fprintf(w.out, "<BR>Unable to encode GIF:<BR>%s<BR>\n", err)277 return278 }279 img[imgpath] = gifbuf280 ssize = fmt.Sprintf("%.0f KB", float32(len(gifbuf.Bytes()))/1024.0)281 iw = i.Bounds().Max.X282 ih = i.Bounds().Max.Y283 log.Printf("%s Encoded GIF image: %s, Size: %s, Colors: %d, %dx%d\n", w.req.RemoteAddr, imgpath, ssize, w.colors, iw, ih)284 case "png":285 pngbuf := bytes.NewBuffer(pngcap)286 img[imgpath] = *pngbuf287 cfg, _, _ := image.DecodeConfig(pngbuf)288 ssize = fmt.Sprintf("%.0f KB", float32(len(pngbuf.Bytes()))/1024.0)289 iw = cfg.Width290 ih = cfg.Height291 log.Printf("%s Got PNG image: %s, Size: %s, %dx%d\n", w.req.RemoteAddr, imgpath, ssize, iw, ih)292 }293 printHTML(w, printParams{294 bgColor: fmt.Sprintf("#%02X%02X%02X", r, g, b),295 pageHeight: fmt.Sprintf("%d PX", h),296 imgSize: ssize,297 imgURL: imgpath,298 mapURL: mappath,299 imgWidth: iw,300 imgHeight: ih,301 })302 log.Printf("%s Done with capture for %s\n", w.req.RemoteAddr, w.url)303}304// Process HTTP requests to WRP '/' url305func pageServer(out http.ResponseWriter, req *http.Request) {306 log.Printf("%s Page Request for %s [%+v]\n", req.RemoteAddr, req.URL.Path, req.URL.RawQuery)307 var w wrpReq308 w.req = req309 w.out = out310 parseForm(&w)311 if len(w.url) < 4 {312 printHTML(w, printParams{bgColor: "#FFFFFF"})313 return314 }315 navigate(w)316 capture(w)317}318// Process HTTP requests to ISMAP '/map/' url319func mapServer(out http.ResponseWriter, req *http.Request) {320 log.Printf("%s ISMAP Request for %s [%+v]\n", req.RemoteAddr, req.URL.Path, req.URL.RawQuery)321 w, ok := ismap[req.URL.Path]322 w.req = req323 w.out = out324 if !ok {325 fmt.Fprintf(out, "Unable to find map %s\n", req.URL.Path)326 log.Printf("Unable to find map %s\n", req.URL.Path)327 return328 }329 if !noDel {330 defer delete(ismap, req.URL.Path)331 }332 n, err := fmt.Sscanf(req.URL.RawQuery, "%d,%d", &w.mouseX, &w.mouseY)333 if err != nil || n != 2 {334 fmt.Fprintf(out, "n=%d, err=%s\n", n, err)335 log.Printf("%s ISMAP n=%d, err=%s\n", req.RemoteAddr, n, err)336 return337 }338 log.Printf("%s WrpReq from ISMAP: %+v\n", req.RemoteAddr, w)339 if len(w.url) < 4 {340 printHTML(w, printParams{bgColor: "#FFFFFF"})341 return342 }343 navigate(w)344 capture(w)345}346// Process HTTP requests for images '/img/' url347func imgServer(out http.ResponseWriter, req *http.Request) {348 log.Printf("%s IMG Request for %s\n", req.RemoteAddr, req.URL.Path)349 imgbuf, ok := img[req.URL.Path]350 if !ok || imgbuf.Bytes() == nil {351 fmt.Fprintf(out, "Unable to find image %s\n", req.URL.Path)352 log.Printf("%s Unable to find image %s\n", req.RemoteAddr, req.URL.Path)353 return354 }355 if !noDel {356 defer delete(img, req.URL.Path)357 }358 switch {359 case strings.HasPrefix(req.URL.Path, ".gif"):360 out.Header().Set("Content-Type", "image/gif")361 case strings.HasPrefix(req.URL.Path, ".png"):362 out.Header().Set("Content-Type", "image/png")363 }364 out.Header().Set("Content-Length", strconv.Itoa(len(imgbuf.Bytes())))365 out.Header().Set("Cache-Control", "max-age=0")366 out.Header().Set("Expires", "-1")367 out.Header().Set("Pragma", "no-cache")368 out.Write(imgbuf.Bytes())369 out.(http.Flusher).Flush()370}371// Process HTTP requests for Shutdown via '/shutdown/' url372func haltServer(out http.ResponseWriter, req *http.Request) {373 log.Printf("%s Shutdown Request for %s\n", req.RemoteAddr, req.URL.Path)374 out.Header().Set("Cache-Control", "max-age=0")375 out.Header().Set("Expires", "-1")376 out.Header().Set("Pragma", "no-cache")377 out.Header().Set("Content-Type", "text/plain")378 fmt.Fprintf(out, "Shutting down WRP...\n")379 out.(http.Flusher).Flush()380 time.Sleep(time.Second * 2)381 cancel()382 srv.Shutdown(context.Background())383 os.Exit(1)384}385// returns html template, either from html file or built-in386func tmpl(t string) string {387 var tmpl []byte388 fh, err := os.Open(t)389 if err != nil {390 goto statik391 }392 tmpl, err = ioutil.ReadAll(fh)393 if err != nil {394 goto statik395 }396 log.Printf("Got UI template from %v file\n", t)397 return string(tmpl)398statik:399 sfs, err := fs.New()400 if err != nil {401 log.Fatal(err)402 }403 fhs, err := sfs.Open("/wrp.html")404 if err != nil {405 log.Fatal(err)406 }407 tmpl, err = ioutil.ReadAll(fhs)408 if err != nil {409 log.Fatal(err)410 }411 log.Printf("Got UI template from built-in\n")412 return string(tmpl)413}414// Main...415func main() {416 var addr, fgeom, tHTML string417 var headless bool418 var debug bool419 var err error420 flag.StringVar(&addr, "l", ":8080", "Listen address:port, default :8080")421 flag.BoolVar(&headless, "h", true, "Headless mode - hide browser window")422 flag.BoolVar(&debug, "d", false, "Debug ChromeDP")423 flag.BoolVar(&noDel, "n", false, "Do not free maps and images after use")424 flag.StringVar(&defType, "t", "gif", "Image type: gif|png")425 flag.StringVar(&fgeom, "g", "1152x600x256", "Geometry: width x height x colors, height can be 0 for unlimited")426 flag.StringVar(&tHTML, "ui", "wrp.html", "HTML template file for the UI")427 flag.Parse()428 if len(os.Getenv("PORT")) > 0 {429 addr = ":" + os.Getenv(("PORT"))430 }431 n, err := fmt.Sscanf(fgeom, "%dx%dx%d", &defGeom.w, &defGeom.h, &defGeom.c)432 if err != nil || n != 3 {433 log.Fatalf("Unable to parse -g geometry flag / %s", err)434 }435 opts := append(chromedp.DefaultExecAllocatorOptions[:],436 chromedp.Flag("headless", headless),437 chromedp.Flag("hide-scrollbars", false),438 )439 actx, acancel := chromedp.NewExecAllocator(context.Background(), opts...)440 defer acancel()441 if debug {442 ctx, cancel = chromedp.NewContext(actx, chromedp.WithDebugf(log.Printf))443 } else {444 ctx, cancel = chromedp.NewContext(actx)445 }446 defer cancel()447 rand.Seed(time.Now().UnixNano())448 c := make(chan os.Signal)449 signal.Notify(c, os.Interrupt, syscall.SIGTERM)450 go func() {451 <-c452 log.Printf("Interrupt - shutting down.")453 cancel()454 srv.Shutdown(context.Background())455 os.Exit(1)456 }()457 http.HandleFunc("/", pageServer)458 http.HandleFunc("/map/", mapServer)459 http.HandleFunc("/img/", imgServer)460 http.HandleFunc("/shutdown/", haltServer)461 http.HandleFunc("/favicon.ico", http.NotFound)462 log.Printf("Web Rendering Proxy Version %s\n", version)463 log.Printf("Args: %q", os.Args)464 log.Printf("Default Img Type: %v, Geometry: %+v", defType, defGeom)465 htmlTmpl, err = template.New("wrp.html").Parse(tmpl(tHTML))466 if err != nil {467 log.Fatal(err)468 }469 log.Printf("Starting WRP http server on %s\n", addr)470 srv.Addr = addr471 err = srv.ListenAndServe()472 if err != nil {473 log.Fatal(err)474 }475}...

Full Screen

Full Screen

html_image.go

Source:html_image.go Github

copy

Full Screen

...56func (e *HTMLImage) UseMap(v string) *HTMLImage {57 e.a["usemap"] = v58 return e59}60// IsMap sets the element's "ismap" attribute61func (e *HTMLImage) IsMap(v bool) *HTMLImage {62 if v {63 e.a["ismap"] = ""64 } else {65 delete(e.a, "ismap")66 }67 return e68}69// Width sets the element's "width" attribute70func (e *HTMLImage) Width(v int) *HTMLImage {71 e.a["width"] = v72 return e73}74// Height sets the element's "height" attribute75func (e *HTMLImage) Height(v int) *HTMLImage {...

Full Screen

Full Screen

pongo.go

Source:pongo.go Github

copy

Full Screen

1package middleware2import (3 "net/http"4 "strings"5 "github.com/flosch/pongo2"6 . "github.com/gin-gonic/gin"7)8func Pongo2() HandlerFunc {9 return func(c *Context) {10 c.Next()11 name := stringFromContext(c, "template")12 if name == "" {13 return14 }15 if !strings.HasSuffix(name, ".html") {16 name = name + ".html"17 }18 name = "resource/views/" + name19 template := pongo2.Must(pongo2.FromFile(name))20 err := template.ExecuteWriter(InjectParams(c), c.Writer)21 if err != nil {22 http.Error(c.Writer, err.Error(), http.StatusInternalServerError)23 }24 }25}26func stringFromContext(c *Context, input string) string {27 raw, ok := c.Get(input)28 if ok {29 strVal, ok := raw.(string)30 if ok {31 return strVal32 }33 }34 return ""35}36func convertContext(thing interface{}, menus interface{}, router interface{}, user interface{}) pongo2.Context {37 if thing != nil {38 context, isMap := thing.(map[string]interface{})39 if isMap {40 if menus != nil {41 context["menus"] = menus42 }43 if router != nil {44 context["router"] = router45 }46 if user != nil {47 context["user"] = router48 }49 return context50 }51 }52 return nil53}54func getContext(templateData interface{}, err error) pongo2.Context {55 if templateData == nil || err != nil {56 return nil57 }58 contextData, isMap := templateData.(map[string]interface{})59 if isMap {60 return contextData61 }62 return nil63}...

Full Screen

Full Screen

IsMap

Using AI Code Generation

copy

Full Screen

1import (2func main() {3 if err != nil {4 fmt.Println(err)5 }6 defer res.Body.Close()7 if res.StatusCode != 200 {8 fmt.Println("status code error: %d %s", res.StatusCode, res.Status)9 }10 doc, err := goquery.NewDocumentFromReader(res.Body)11 if err != nil {12 fmt.Println(err)13 }14 doc.Find("html").Each(func(i int, s *goquery.Selection) {15 fmt.Println(s.Text())16 fmt.Println(s.Is("html"))17 })18}19import (20func main() {21 if err != nil {22 fmt.Println(err)23 }24 defer res.Body.Close()25 if res.StatusCode != 200 {26 fmt.Println("status code error: %d %s", res.StatusCode, res.Status)27 }28 doc, err := goquery.NewDocumentFromReader(res.Body)29 if err != nil {30 fmt.Println(err)31 }32 doc.Find("html").Each(func(i int, s *goquery.Selection) {33 fmt.Println(s.Text())34 fmt.Println(s.Is("html"))35 fmt.Println(s.Is("html"))36 })37}38import (39func main() {

Full Screen

Full Screen

IsMap

Using AI Code Generation

copy

Full Screen

1import (2func main() {3 if err != nil {4 fmt.Println(err)5 }6 defer resp.Body.Close()7 doc, err := html.Parse(resp.Body)8 if err != nil {9 fmt.Println(err)10 }11 visit(doc)12}13func visit(n *html.Node) {14 if n.Type == html.ElementNode && n.Data == "a" {15 for _, a := range n.Attr {16 if a.Key == "href" {17 fmt.Println(a.Val)18 }19 }20 }21 for c := n.FirstChild; c != nil; c = c.NextSibling {22 visit(c)23 }24}

Full Screen

Full Screen

IsMap

Using AI Code Generation

copy

Full Screen

1import (2func main() {3 c := colly.NewCollector()4 c.OnHTML("div", func(e *colly.HTMLElement) {5 if e.Is("div") {6 fmt.Println(e

Full Screen

Full Screen

IsMap

Using AI Code Generation

copy

Full Screen

1import (2func main() {3 if err != nil {4 fmt.Print("document not found")5 }6 doc.Find(".star-box-giga-star").Each(func(i int, s *goquery.Selection) {7 band := s.Text()8 fmt.Printf("Review %d: %s\n", i, band)9 })10}

Full Screen

Full Screen

IsMap

Using AI Code Generation

copy

Full Screen

1import (2func main() {3 if err != nil {4 log.Fatal(err)5 }6 fmt.Println(htmlquery.InnerText(doc))7}

Full Screen

Full Screen

IsMap

Using AI Code Generation

copy

Full Screen

1import (2func main() {3 if err != nil {4 fmt.Println(err)5 }6 if doc.IsMap() {7 fmt.Println("Map is present")8 } else {9 fmt.Println("Map is not present")10 }11}12func (s *Selection) IsNode() bool13import (14func main() {15 if err != nil {16 fmt.Println(err)17 }18 if doc.IsNode() {19 fmt.Println("Node is present")20 } else {21 fmt.Println("Node is not present")22 }23}24func (s *Selection) IsObject() bool25import (26func main() {27 if err != nil {28 fmt.Println(err)29 }30 if doc.IsObject() {31 fmt.Println("Object is present")32 } else {33 fmt.Println("Object is not present")34 }35}36func (s *Selection) IsOl() bool37import (

Full Screen

Full Screen

IsMap

Using AI Code Generation

copy

Full Screen

1import (2func main() {3 if err != nil {4 log.Fatal(err)5 }6 defer res.Body.Close()7 if res.StatusCode != 200 {8 log.Fatalf("status code error: %d %s", res.StatusCode, res.Status)9 }10 doc, err := goquery.NewDocumentFromReader(res.Body)11 if err != nil {12 log.Fatal(err)13 }14 doc.Find(".review").Each(func(i int, s *goquery.Selection) {15 band := s.Find("i").Text()16 title := s.Find("b").Text()17 fmt.Printf("Review %d: %s - %s\n", i, band, title)18 })19}20Find(selector string) *Selection21import (22func main() {23 if err != nil {24 log.Fatal(err)

Full Screen

Full Screen

Automation Testing Tutorials

Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.

LambdaTest Learning Hubs:

YouTube

You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.

Run K6 automation tests on LambdaTest cloud grid

Perform automation testing on 3000+ real desktop and mobile devices online.

Most used method in

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful