<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Klaus</title>
    <description>The latest articles on Forem by Klaus (@razgandeanu).</description>
    <link>https://forem.com/razgandeanu</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F85795%2F02378e5f-1a53-4f44-aeee-c160c0d161de.JPG</url>
      <title>Forem: Klaus</title>
      <link>https://forem.com/razgandeanu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/razgandeanu"/>
    <language>en</language>
    <item>
      <title>9 Extremely Useful HTML Tricks</title>
      <dc:creator>Klaus</dc:creator>
      <pubDate>Thu, 12 Dec 2019 16:27:20 +0000</pubDate>
      <link>https://forem.com/razgandeanu/9-extremely-useful-html-tricks-463a</link>
      <guid>https://forem.com/razgandeanu/9-extremely-useful-html-tricks-463a</guid>
      <description>&lt;p&gt;HTML has plenty of practical secrets that might come in handy.&lt;/p&gt;

&lt;p&gt;But I do want to make sure that the site is working on Internet Explorer and other browsers.&lt;/p&gt;

&lt;p&gt;I use &lt;strong&gt;&lt;a href="https://endtest.io"&gt;Endtest&lt;/a&gt;&lt;/strong&gt; to create automated tests and execute them on the cross-browser cloud.&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/4DIVKcs--TA"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://jobs.lever.co/netflix/db335e29-c731-42ff-ad3a-eeecbe95b36f"&gt;Netflix&lt;/a&gt;&lt;/strong&gt; uses the same platform to test their web apps.&lt;/p&gt;

&lt;p&gt;It's even listed as a Required Skill for some of their &lt;strong&gt;&lt;a href="https://www.linkedin.com/jobs/view/1486749071/"&gt;jobs&lt;/a&gt;&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://endtest.io"&gt;Endtest&lt;/a&gt;&lt;/strong&gt; does have some really nice features, such as:&lt;br&gt;
• Cross-browser grid, running on Windows and macOS machines&lt;br&gt;
• Codeless Editor for Automated Tests&lt;br&gt;
• Support for Web Applications&lt;br&gt;
• Support for both native and hybrid Android and iOS apps&lt;br&gt;
• Unlimited Video Recordings for your test runs&lt;br&gt;
• Screenshot Comparison&lt;br&gt;
• Geolocation&lt;br&gt;
• If Statements&lt;br&gt;
• Loops&lt;br&gt;
• Upload files in your tests&lt;br&gt;
• An Endtest API, for easy integration with your CI/CD system&lt;br&gt;
• Advanced Assertions&lt;br&gt;
• Mobile Tests on real mobile devices&lt;br&gt;
• Email testing with Endtest Mailbox&lt;/p&gt;

&lt;p&gt;You should check out the &lt;strong&gt;&lt;a href="https://endtest.io/guides/docs/how-to-create-web-tests/"&gt;docs&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Below are 9 extremely useful HTML tricks. &lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;1. The &lt;code&gt;&amp;lt;figure&amp;gt;&lt;/code&gt; tag&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This can be used to mark up a photo.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;&amp;lt;figure&amp;gt;&lt;/code&gt; element can also contain a &lt;code&gt;&amp;lt;figcaption&amp;gt;&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;figure&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://thepracticaldev.s3.amazonaws.com/i/g84et7kjgp2phal89140.jpg"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Swat Kats"&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"width:100%"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;figcaption&amp;gt;&lt;/span&gt;Fig.1 - SWAT Kats&lt;span class="nt"&gt;&amp;lt;/figcaption&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/figure&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And this is what it would look like:&lt;br&gt;
&lt;iframe height="600" src="https://codepen.io/klaus_camarena/embed/qBENjVz?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;2. The &lt;code&gt;&amp;lt;video&amp;gt;&lt;/code&gt; tag&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This allows you to embed a media player for video playback.&lt;/p&gt;

&lt;p&gt;For example, you can upload your video on AWS S3 and use the &lt;code&gt;&amp;lt;video&amp;gt;&lt;/code&gt; tag to embed it on your website. &lt;/p&gt;

&lt;p&gt;Using YouTube for that might come off as unprofessional.&lt;/p&gt;

&lt;p&gt;And Vimeo doesn't allow you to embed your videos without paying. ☹️&lt;/p&gt;

&lt;p&gt;You can specify certain attributes, such as width, height, autoplay, loop, controls, etc.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;video&lt;/span&gt; &lt;span class="na"&gt;autoplay=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt; &lt;span class="na"&gt;loop=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt; &lt;span class="na"&gt;controls=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt; &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"640"&lt;/span&gt; &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"480"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;source&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"video/mp4"&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://endtest-videos.s3-us-west-2.amazonaws.com/documentation/endtest_data_driven_testing_csv.mp4"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/video&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And this is what it would look like:&lt;br&gt;
&lt;iframe height="600" src="https://codepen.io/klaus_camarena/embed/KKwMqEe?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;You can also embed a live stream using &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia"&gt;getUserMedia()&lt;/a&gt; or &lt;a href="https://webrtc.org/"&gt;WebRTC&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;3. The &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; tag&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This tag helps you display images in a responsive manner, by showing an alternative image version for smaller viewports.&lt;/p&gt;

&lt;p&gt;It needs to contain one or more &lt;code&gt;&amp;lt;source&amp;gt;&lt;/code&gt; tags and one &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; tag.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; tag will be used only if the viewport doesn't match any of the &lt;code&gt;&amp;lt;source&amp;gt;&lt;/code&gt; tags or if the browser does not support it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;picture&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;source&lt;/span&gt; &lt;span class="na"&gt;media=&lt;/span&gt;&lt;span class="s"&gt;"(min-width: 968px)"&lt;/span&gt; &lt;span class="na"&gt;srcset=&lt;/span&gt;&lt;span class="s"&gt;"large_img.jpg"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;source&lt;/span&gt; &lt;span class="na"&gt;media=&lt;/span&gt;&lt;span class="s"&gt;"(min-width: 360px)"&lt;/span&gt; &lt;span class="na"&gt;srcset=&lt;/span&gt;&lt;span class="s"&gt;"small_img.jpg"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"default_img.jpg"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"avatar"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/picture&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;4. The &lt;code&gt;&amp;lt;progress&amp;gt;&lt;/code&gt; tag&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;&amp;lt;progress&amp;gt;&lt;/code&gt; tag represents the progress of a task.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;&amp;lt;progress&amp;gt;&lt;/code&gt; tag should not be confused with the &lt;code&gt;&amp;lt;meter&amp;gt;&lt;/code&gt; tag (which represents a gauge).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;progress&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"63"&lt;/span&gt; &lt;span class="na"&gt;max=&lt;/span&gt;&lt;span class="s"&gt;"100"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/progress&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is what it looks like:&lt;br&gt;
&lt;iframe height="600" src="https://codepen.io/klaus_camarena/embed/WNbxEja?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;5. The &lt;code&gt;&amp;lt;meter&amp;gt;&lt;/code&gt; tag&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;You can use the &lt;code&gt;meter&lt;/code&gt; element to measure data within a given range (a gauge).&lt;/p&gt;

&lt;p&gt;This can be achieved with min and max values or with a percentage.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;meter&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"2"&lt;/span&gt; &lt;span class="na"&gt;min=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt; &lt;span class="na"&gt;max=&lt;/span&gt;&lt;span class="s"&gt;"10"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;2 out of 10&lt;span class="nt"&gt;&amp;lt;/meter&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;meter&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"0.6"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;60%&lt;span class="nt"&gt;&amp;lt;/meter&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And here they are:&lt;br&gt;
&lt;iframe height="600" src="https://codepen.io/klaus_camarena/embed/gObMxxv?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;6. The &lt;code&gt;&amp;lt;map&amp;gt;&lt;/code&gt; tag&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;&amp;lt;map&amp;gt;&lt;/code&gt; tag is used to define a client-side image-map. &lt;/p&gt;

&lt;p&gt;An image-map is an image with clickable areas.&lt;/p&gt;

&lt;p&gt;All you have to do is mention the X and Y coordinates in the  elements from the &lt;code&gt;&amp;lt;map&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This means that you create a map of our Solar System and define areas for each planet and take the visitors to a separate page for each planet they click on.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"solar_system.png"&lt;/span&gt; &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"500"&lt;/span&gt; &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"300"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Planets"&lt;/span&gt; &lt;span class="na"&gt;usemap=&lt;/span&gt;&lt;span class="s"&gt;"#planetmap"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;map&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"planetmap"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;area&lt;/span&gt; &lt;span class="na"&gt;shape=&lt;/span&gt;&lt;span class="s"&gt;"rect"&lt;/span&gt; &lt;span class="na"&gt;coords=&lt;/span&gt;&lt;span class="s"&gt;"0,0,52,92"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"earth.htm"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Earth"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;area&lt;/span&gt; &lt;span class="na"&gt;shape=&lt;/span&gt;&lt;span class="s"&gt;"circle"&lt;/span&gt; &lt;span class="na"&gt;coords=&lt;/span&gt;&lt;span class="s"&gt;"60,48,5"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"mars.htm"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Mars"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;area&lt;/span&gt; &lt;span class="na"&gt;shape=&lt;/span&gt;&lt;span class="s"&gt;"circle"&lt;/span&gt; &lt;span class="na"&gt;coords=&lt;/span&gt;&lt;span class="s"&gt;"135,48,12"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"saturn.htm"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Saturn"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/map&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;7. The contenteditable attribute&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This attribute specifies whether the content of an element is editable or not.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;contenteditable=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;This is an editable paragraph.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/klaus_camarena/embed/xxbOLMg?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;8. Input suggestions&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;list=&lt;/span&gt;&lt;span class="s"&gt;"planets"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;datalist&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"planets"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"Mercury"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"Venus"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"Earth"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"Mars"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"Jupiter"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"Saturn"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"Uranus"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"Neptune"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/datalist&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I hope you don't mind that I didn't add any styling.&lt;/p&gt;

&lt;p&gt;I prefer to keep things as vanilla as possible in my examples.&lt;br&gt;
&lt;iframe height="600" src="https://codepen.io/klaus_camarena/embed/bGNerYx?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;9. The &lt;code&gt;&amp;lt;noscript&amp;gt;&lt;/code&gt; tag&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The content inside the &lt;code&gt;&amp;lt;noscript&amp;gt;&lt;/code&gt; element is rendered by the browser only when JavaScript is disabled. &lt;/p&gt;

&lt;p&gt;It provides a fallback mechanism for the components that will stop working without JavaScript.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;noscript&amp;gt;&amp;lt;h2&amp;gt;&lt;/span&gt;JavaScript is disabled in your browser.&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&amp;lt;/noscript&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I think it's really cool that you're looking for HTML tricks, but are you sure your Web Application is working correctly on all browsers and devices?&lt;/p&gt;

&lt;p&gt;You can use &lt;strong&gt;&lt;a href="https://endtest.io"&gt;Endtest&lt;/a&gt;&lt;/strong&gt; to quickly create Automated Tests and execute them on the cross-browser cloud. &lt;/p&gt;

&lt;p&gt;You don't even have to code in order to use it.&lt;/p&gt;

&lt;p&gt;Seriously, just read the &lt;strong&gt;&lt;a href="https://endtest.io/guides/docs/how-to-create-web-tests/"&gt;docs&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>html</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Best Automated Testing Tools for 2020</title>
      <dc:creator>Klaus</dc:creator>
      <pubDate>Wed, 11 Dec 2019 08:42:26 +0000</pubDate>
      <link>https://forem.com/razgandeanu/best-automated-testing-tools-for-2020-2bm6</link>
      <guid>https://forem.com/razgandeanu/best-automated-testing-tools-for-2020-2bm6</guid>
      <description>&lt;p&gt;As developers, we have the responsibility to provide our users with functional applications.&lt;/p&gt;

&lt;p&gt;Each year, I explore all the relevant solutions for automated testing and rank them based on a list of requirements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclaimer&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I do not discriminate against open source or proprietary technologies. &lt;/p&gt;

&lt;p&gt;I do wish all the solutions were free and open source, but one of my requirements is for the solution to include a cross-browser cloud. &lt;/p&gt;

&lt;p&gt;Because some of our users are using Safari or Internet Explorer 11.&lt;/p&gt;

&lt;p&gt;If you're preparing to type a comment like this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But did you try that E2E-library-that-only-works-for-Chrome?&lt;/strong&gt; 🤓&lt;/p&gt;

&lt;p&gt;Please stop and check if it fulfils most of the listed requirements. &lt;/p&gt;

&lt;p&gt;If it does, please tell us about it in a comment. &lt;/p&gt;

&lt;p&gt;I personally don't believe in open source solutions, backed up by huge marketing budgets spent on bashing Selenium. &lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Requirement&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Endtest&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;BrowserStack&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Sauce Labs&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Works for Web Applications&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Works for Mobile Applications&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Solid Documentation&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloud with browsers on Windows machines&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloud with browsers on macOS machines&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Codeless Technology&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;🔲&lt;/td&gt;
&lt;td&gt;🔲&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scheduler&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;🔲&lt;/td&gt;
&lt;td&gt;🔲&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Useful Customer Support&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;🔲&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Email Testing&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;🔲&lt;/td&gt;
&lt;td&gt;🔲&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Geolocation&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Video recording of test executions&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;1. &lt;a href="https://endtest.io"&gt;Endtest&lt;/a&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;A cloud platform that allows you to create, manage and run Automated Tests for Web Applications and Native Mobile Apps (Android &amp;amp; iOS), without having to write any code.&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/4DIVKcs--TA"&gt;
&lt;/iframe&gt;
&lt;br&gt;
Lots of nice features, such as:&lt;br&gt;
• Cross-browser grid, running on Windows and macOS machines&lt;br&gt;
• Codeless Editor for Automated Tests&lt;br&gt;
• Support for Web Applications&lt;br&gt;
• Support for both native and hybrid Android and iOS apps&lt;br&gt;
• Video recordings for test executions&lt;br&gt;
• Detailed logs&lt;br&gt;
• Chrome extension to record web tests&lt;br&gt;
• Element Inspector for mobile apps&lt;br&gt;
• Screenshot comparison&lt;br&gt;
• Data-driven testing with CSV files&lt;br&gt;
• Geolocation&lt;br&gt;
• Email, Slack and Webhook notifications&lt;br&gt;
• If Statements and Loops&lt;br&gt;
• Variables and re-usable components&lt;br&gt;
• Support for file uploads in the tests&lt;br&gt;
• An Endtest API, for integration with CI/CD systems&lt;br&gt;
• Advanced Assertions&lt;br&gt;
• Endtest Mailbox, for testing emails&lt;br&gt;
• Self-healing tests&lt;/p&gt;

&lt;p&gt;This is what it looks like when you want to execute a test:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Gvxt2hag--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ku9gwet2genzvkp10r5n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Gvxt2hag--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ku9gwet2genzvkp10r5n.png" alt="Endtest UI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And these are the detailed logs from a test execution:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UYx4is-8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/5717ka5bwovmlb8xduzt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UYx4is-8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/5717ka5bwovmlb8xduzt.png" alt="Endtest Results"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Their &lt;a href="https://endtest.io/guides/docs/how-to-create-web-tests/"&gt;Documentation&lt;/a&gt; is fantastic. Lots of examples and videos.&lt;/p&gt;

&lt;p&gt;I got quick responses from the Endtest Support, which is constantly praised in the &lt;a href="https://www.capterra.com/p/180545/Endtest/"&gt;reviews&lt;/a&gt; I found online.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jobs.lever.co/netflix/db335e29-c731-42ff-ad3a-eeecbe95b36f"&gt;Netflix&lt;/a&gt; uses this platform to test their web apps. It's even listed as a Required Skill for some of their &lt;a href="https://www.linkedin.com/jobs/view/1486749071/"&gt;jobs&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Clearly, &lt;a href="https://endtest.io"&gt;Endtest&lt;/a&gt; is the winner.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;2. &lt;a href="https://browserstack.com"&gt;BrowserStack&lt;/a&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;BrowserStack is a cloud platform that offers you a list of browsers and mobile devices to execute your Selenium and Appium tests.&lt;/p&gt;

&lt;p&gt;Features:&lt;br&gt;
• Cross-browser grid, running on Windows and macOS machines&lt;br&gt;
• Mobile device lab with emulators and real devices&lt;br&gt;
• Video recordings for test executions&lt;br&gt;
• Detailed logs&lt;br&gt;
• Geolocation&lt;br&gt;
• BrowserStack API&lt;/p&gt;

&lt;p&gt;The User Interface is definitely intuitive:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--J-nnNv9---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/jk8odobq8fd70nfui0op.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--J-nnNv9---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/jk8odobq8fd70nfui0op.png" alt="BrowserStack UI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://www.browserstack.com/docs"&gt;Documentation&lt;/a&gt; from BrowserStack is well structured and offers numerous examples.&lt;/p&gt;

&lt;p&gt;What I didn't like about it is the amount of effort it takes to make it work.&lt;/p&gt;

&lt;p&gt;It doesn't offer any out-of-the-box features.&lt;/p&gt;

&lt;p&gt;The Support from BrowserStack could be better. They do not have a chat and it takes a few hours to get a response. &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;3. &lt;a href="https://saucelabs.com"&gt;Sauce Labs&lt;/a&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Sauce Labs is very similar to BrowserStack, also a cloud platform that offers you a list of browsers and mobile devices to execute your Selenium and Appium tests.&lt;/p&gt;

&lt;p&gt;With similar features:&lt;br&gt;
• Cross-browser grid, running on Windows and macOS machines&lt;br&gt;
• Mobile device lab with emulators and real devices&lt;br&gt;
• Video recordings for test executions&lt;br&gt;
• Detailed logs&lt;br&gt;
• Geolocation&lt;br&gt;
• Sauce Labs API&lt;/p&gt;

&lt;p&gt;This is what it looks like:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iIvx9p----/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/9f4w6sbsa536n5w8pslo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iIvx9p----/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/9f4w6sbsa536n5w8pslo.png" alt="Sauce Labs"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's difficult to navigate through the &lt;a href="https://wiki.saucelabs.com"&gt;Documentation&lt;/a&gt; from Sauce Labs. &lt;/p&gt;

&lt;p&gt;You have to spend some time digging around. &lt;/p&gt;

&lt;p&gt;For example, let's say you want to execute your Appium tests on their mobile devices. &lt;/p&gt;

&lt;p&gt;The ID for each device is required, but you won't find any place that contains the list of devices and their IDs. &lt;/p&gt;

&lt;p&gt;Their API feels a bit incomplete. &lt;/p&gt;

&lt;p&gt;I was surprised to find out that you can't upload the latest build for your mobile app with the API, you have to do it manually through the User Interface. &lt;/p&gt;

&lt;p&gt;That's a shame, because both &lt;a href="https://endtest.io"&gt;Endtest&lt;/a&gt; and &lt;a href="https://browserstack.com"&gt;BrowserStack&lt;/a&gt; offer that functionality.&lt;/p&gt;

&lt;p&gt;Our experience with their Customer Support was pleasant.&lt;/p&gt;

</description>
      <category>testing</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>9 Extremely Powerful JavaScript Hacks</title>
      <dc:creator>Klaus</dc:creator>
      <pubDate>Mon, 09 Dec 2019 11:10:13 +0000</pubDate>
      <link>https://forem.com/razgandeanu/9-extremely-powerful-javascript-hacks-4g3p</link>
      <guid>https://forem.com/razgandeanu/9-extremely-powerful-javascript-hacks-4g3p</guid>
      <description>&lt;p&gt;I like to optimize.&lt;/p&gt;

&lt;p&gt;But users don't care about my optimized code if the site isn't working in their Internet Explorer 11 browser.&lt;/p&gt;

&lt;p&gt;I use &lt;strong&gt;&lt;a href="https://endtest.io"&gt;Endtest&lt;/a&gt;&lt;/strong&gt; to create automated tests and execute them on the cross-browser cloud.&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/4DIVKcs--TA"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://jobs.lever.co/netflix/db335e29-c731-42ff-ad3a-eeecbe95b36f"&gt;Netflix&lt;/a&gt;&lt;/strong&gt; uses the same platform to test their web apps.&lt;/p&gt;

&lt;p&gt;It's even listed as a Required Skill for some of their &lt;strong&gt;&lt;a href="https://www.linkedin.com/jobs/view/1486749071/"&gt;jobs&lt;/a&gt;&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://endtest.io"&gt;Endtest&lt;/a&gt;&lt;/strong&gt; does have some really nice features, such as:&lt;br&gt;
• Cross-browser grid, running on Windows and macOS machines&lt;br&gt;
• Codeless Editor for Automated Tests&lt;br&gt;
• Support for Web Applications&lt;br&gt;
• Support for both native and hybrid Android and iOS apps&lt;br&gt;
• Unlimited Video Recordings for your test runs&lt;br&gt;
• Screenshot Comparison&lt;br&gt;
• Geolocation&lt;br&gt;
• If Statements&lt;br&gt;
• Loops&lt;br&gt;
• Upload files in your tests&lt;br&gt;
• An Endtest API, for easy integration with your CI/CD system&lt;br&gt;
• Advanced Assertions&lt;br&gt;
• Mobile Tests on real mobile devices&lt;br&gt;
• Email testing with Endtest Mailbox&lt;/p&gt;

&lt;p&gt;You should check out the &lt;strong&gt;&lt;a href="https://endtest.io/guides/docs/how-to-create-web-tests/"&gt;docs&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Below are 9 extremely powerful JavaScript hacks. &lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;1. Replace All&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;We know that the string.replace() function replaces only the first occurrence.&lt;br&gt;
You can replace all the occurrences by adding /g at the end of the regex.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;example&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;potato potato&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/pot/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tom&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; 
&lt;span class="c1"&gt;// "tomato potato"&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/pot/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tom&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; 
&lt;span class="c1"&gt;// "tomato tomato"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;2. Extract Unique Values&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;We can create a new array only with the unique values by using the Set object and the Spread operator.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;entries&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;unique_entries&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;)];&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;unique_entries&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// [1, 2, 3, 4, 5, 6, 7, 8]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;3. Convert number to string&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;We just have to use the concatenation operator with an empty set of quotation marks.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;converted_number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;converted_number&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// 5&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;converted_number&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
&lt;span class="c1"&gt;// string&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;4. Convert string to number&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;All we need is the + operator.&lt;/p&gt;

&lt;p&gt;Be careful with this one since it only works with 'string numbers'.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;the_string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;123&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;the_string&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// 123&lt;/span&gt;

&lt;span class="nx"&gt;the_string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hello&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;the_string&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// NaN&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;5. Shuffle elements from array&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Every day I'm shufflin'&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;my_list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;my_list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;
&lt;span class="p"&gt;}));&lt;/span&gt; 
&lt;span class="c1"&gt;// [4, 8, 2, 9, 1, 3, 6, 5, 7]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;6. Flatten multidimensional array&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Simply by using the Spread operator.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;entries&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;flat_entries&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[].&lt;/span&gt;&lt;span class="nx"&gt;concat&lt;/span&gt;&lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
&lt;span class="c1"&gt;// [1, 2, 5, 6, 7, 9]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;7. Short Circuit Conditionals&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Let's take this example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;available&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;addToCart&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And shorten it by simply using the variable together with the function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;available&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;addToCart&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;8. Dynamic Property Names&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;I always thought that I first had to declare an object before being able to assign a dynamic property.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dynamic&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;flavour&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Coke&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;dynamic&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Cherry&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
&lt;span class="c1"&gt;// { name: "Coke", flavour: "Cherry" }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;9. Use length to resize/empty an array&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;We basically overwrite the length of the array.&lt;/p&gt;

&lt;p&gt;If we want to resize the array:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;entries&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;  
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
&lt;span class="c1"&gt;// 7  &lt;/span&gt;
&lt;span class="nx"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
&lt;span class="c1"&gt;// 4  &lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
&lt;span class="c1"&gt;// [1, 2, 3, 4]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If we want to empty the array:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;entries&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; 
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
&lt;span class="c1"&gt;// 7  &lt;/span&gt;
&lt;span class="nx"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
&lt;span class="c1"&gt;// 0 &lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
&lt;span class="c1"&gt;// []&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I think it's really cool that you're looking for JavaScript hacks, but are you sure your Web Application is working correctly on all browsers and devices?&lt;/p&gt;

&lt;p&gt;You can use &lt;strong&gt;&lt;a href="https://endtest.io"&gt;Endtest&lt;/a&gt;&lt;/strong&gt; to quickly create Automated Tests and execute them on the cross-browser cloud. &lt;/p&gt;

&lt;p&gt;You don't even have to code in order to use it.&lt;/p&gt;

&lt;p&gt;Seriously, just read the &lt;strong&gt;&lt;a href="https://endtest.io/guides/docs/how-to-create-web-tests/"&gt;docs&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Cover photo by &lt;strong&gt;&lt;a href="https://dev.to/laurieontech"&gt;Laurie&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Selenium Cheat Sheet</title>
      <dc:creator>Klaus</dc:creator>
      <pubDate>Tue, 03 Dec 2019 16:22:27 +0000</pubDate>
      <link>https://forem.com/razgandeanu/selenium-cheat-sheet-9lc</link>
      <guid>https://forem.com/razgandeanu/selenium-cheat-sheet-9lc</guid>
      <description>&lt;p&gt;Selenium is a framework for testing web applications.&lt;/p&gt;

&lt;p&gt;Below is my cheat sheet for Selenium. &lt;/p&gt;

&lt;p&gt;I'm using Python 🐍, but the concepts are the same for the rest of the languages.&lt;/p&gt;

&lt;p&gt;I use &lt;strong&gt;&lt;a href="https://endtest.io"&gt;Endtest&lt;/a&gt;&lt;/strong&gt; to quickly create Automated Tests and execute them on the cross-browser cloud.&lt;/p&gt;

&lt;p&gt;You should check out the &lt;strong&gt;&lt;a href="https://endtest.io/guides/docs/how-to-create-web-tests/"&gt;docs&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;1. Import the Selenium library&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;You can get Selenium from &lt;a href="https://pypi.org/project/selenium/"&gt;here&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;selenium&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;webdriver&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;2. Start the webdriver and the browser&lt;/strong&gt;
&lt;/h2&gt;

&lt;h4&gt;
  
  
  Starting the webdriver and the Chrome browser.
&lt;/h4&gt;

&lt;p&gt;You can get ChromeDriver from &lt;a href="https://sites.google.com/a/chromium.org/chromedriver/"&gt;here&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;chromedriver&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"C:/tests/chromedriver.exe"&lt;/span&gt;
&lt;span class="n"&gt;driver&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;webdriver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Chrome&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;executable_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;chromedriver&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Starting the webdriver and the Firefox browser.
&lt;/h4&gt;

&lt;p&gt;You can get GeckoDriver from &lt;a href="https://github.com/mozilla/geckodriver/releases"&gt;here&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;geckodriver&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"C:/tests/geckodriver.exe"&lt;/span&gt;
&lt;span class="n"&gt;driver&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;webdriver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Firefox&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;executable_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;geckodriver&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Starting the webdriver and the Internet Explorer browser.
&lt;/h4&gt;

&lt;p&gt;You can get IEDriverServer from &lt;a href="https://selenium.dev/downloads/"&gt;here&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;iedriver&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"C:/tests/IEDriverServer.exe"&lt;/span&gt;
&lt;span class="n"&gt;driver&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;webdriver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Firefox&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;executable_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;iedriver&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Starting the webdriver and the Safari browser.
&lt;/h4&gt;

&lt;p&gt;Nothing to download. The SafariDriver is integrated in Safari.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;driver&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;webdriver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Safari&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of having machines with all those browsers, I just use &lt;strong&gt;&lt;a href="https://endtest.io"&gt;Endtest&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It's a platform for Codeless Automated Testing where you can create, manage and execute tests on real browsers on Windows and macOS machines and mobile devices. &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;3. Open a website&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;the_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"https://example.com"&lt;/span&gt;
&lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;the_url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;4. Find an element&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Let's try to find this element:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"/sign-up"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"register"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"register"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"cta nav-link"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Sign Up&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Find element by ID
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;the_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'register'&lt;/span&gt;
&lt;span class="n"&gt;element&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find_element_by_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;the_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Find element by Name
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;the_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'register'&lt;/span&gt;
&lt;span class="n"&gt;element&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find_element_by_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;the_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Find element by Class Name
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;the_class_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'nav-link'&lt;/span&gt;
&lt;span class="n"&gt;element&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find_element_by_class_name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;the_class_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Find element by Tag Name
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;the_tag_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'a'&lt;/span&gt;
&lt;span class="n"&gt;element&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find_element_by_tag_name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;the_tag_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Find element by Link Text
&lt;/h4&gt;

&lt;p&gt;&lt;em&gt;Works only for anchor elements.&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;the_link_text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'Sign Up'&lt;/span&gt;
&lt;span class="n"&gt;element&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find_element_by_link_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;the_link_text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Find element by Partial Link Text
&lt;/h4&gt;

&lt;p&gt;&lt;em&gt;Works only for anchor elements.&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;the_partial_link_text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'Sign'&lt;/span&gt;
&lt;span class="n"&gt;element&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find_element_by_partial_link_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;the_partial_link_text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Find element by CSS Selector
&lt;/h4&gt;

&lt;p&gt;You can extract the CSS Selector from the browser.&lt;/p&gt;

&lt;p&gt;Or you can write your own by using an attribute from the element:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="o"&gt;*[&lt;/span&gt;&lt;span class="nt"&gt;attribute&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"attribute_value"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For our element, a custom CSS Selector would be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"/sign-up"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;the_css_selector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'a[href="/sign-up"]'&lt;/span&gt;
&lt;span class="n"&gt;element&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find_element_by_css_selector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;the_css_selector&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Find element by XPath
&lt;/h4&gt;

&lt;p&gt;You can extract the XPath from the browser.&lt;/p&gt;

&lt;p&gt;Or you can write your own by using an attribute from the element:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="o"&gt;//*[&lt;/span&gt;&lt;span class="k"&gt;@attribute&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;"attribute_value"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For our element, a custom XPath would be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="k"&gt;@href&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;"/sign-up"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can read more about that &lt;a href="https://endtest.io/guides/docs/dealing-with-dynamic-locators/"&gt;here&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;the_xpath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'//a[@href = "/sign-up"]'&lt;/span&gt;
&lt;span class="n"&gt;element&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find_element_by_xpath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;the_xpath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;5. Click on an element&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;the_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'register'&lt;/span&gt;
&lt;span class="n"&gt;element&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find_element_by_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;the_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;click&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;6. Write text inside an element&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Works only for inputs and textareas.&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;the_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'email'&lt;/span&gt;
&lt;span class="n"&gt;the_email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'klaus@werner.de'&lt;/span&gt;
&lt;span class="n"&gt;element&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find_element_by_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;the_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;send_keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;the_email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;7. Select an option&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Works only for select elements.&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;select&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"country"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"US"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;United States&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"CA"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Canada&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"MX"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Mexico&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/select&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's select Canada. 🇨🇦&lt;/p&gt;

&lt;h4&gt;
  
  
  You can use the visible text:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;the_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'country'&lt;/span&gt;
&lt;span class="n"&gt;element&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find_element_by_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;the_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;select_element&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;element&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;select_element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;select_by_visible_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Canada'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  You can use the value:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;the_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'country'&lt;/span&gt;
&lt;span class="n"&gt;element&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find_element_by_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;the_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;select_element&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;element&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;select_element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;select_by_value&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'CA'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  You can also use the index:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;the_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'country'&lt;/span&gt;
&lt;span class="n"&gt;element&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find_element_by_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;the_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;select_element&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;element&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;select_element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;select_by_index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;8. Take a screenshot&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;the_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'C:/tests/screenshots/1.png'&lt;/span&gt;
&lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;save_screenshot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;the_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Selenium does not offer Screenshot Comparison but we know &lt;a href="https://endtest.io/guides/docs/screenshot-comparison/"&gt;who&lt;/a&gt; does.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;9. Upload a file&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This works by using the send_keys method to write the local path of the file in the input type="file" element. &lt;/p&gt;

&lt;p&gt;Let's use this example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"file"&lt;/span&gt; &lt;span class="na"&gt;multiple=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"upload_button"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;the_file_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'C:/tests/files/example.pdf'&lt;/span&gt;
&lt;span class="n"&gt;the_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'upload_button'&lt;/span&gt;
&lt;span class="n"&gt;element&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find_element_by_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;the_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;send_keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;the_file_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can read more about uploading files in a test &lt;a href="https://endtest.io/guides/docs/how-to-test-file-uploads/"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;10. Execute JavaScript&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;In some cases, you might need to execute some JavaScript code.&lt;/p&gt;

&lt;p&gt;This works exactly like you would execute it in your browser console.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;js_code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'document.getElementById("pop-up").remove()'&lt;/span&gt;
&lt;span class="n"&gt;driver&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;execute_script&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;js_code&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;11. Switch to iframe&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;iframe&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"payment_section"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"card_number"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"card_name"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"expiration_date"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"cvv"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/iframe&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;the_iframe_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'payment_section'&lt;/span&gt;
&lt;span class="n"&gt;the_element_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'card_number'&lt;/span&gt;
&lt;span class="n"&gt;the_iframe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find_element_by_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;the_iframe_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;switch_to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;the_iframe&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;element&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find_element_by_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;the_element_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;send_keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'41111111111111'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;switch_to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;default_content&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://endtest.io"&gt;Endtest&lt;/a&gt; also supports iframes and it even supports Shadow DOM.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;12. Switch to the next tab&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;You have to store the handle of your current tab in a global variable.&lt;/p&gt;

&lt;p&gt;If you have only one tab open, the handle is 0.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;global&lt;/span&gt; &lt;span class="n"&gt;nextTab&lt;/span&gt;
&lt;span class="k"&gt;global&lt;/span&gt; &lt;span class="n"&gt;currentTab&lt;/span&gt;
&lt;span class="n"&gt;nextTab&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;currentTab&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;switch_to_window&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;window_handles&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;nextTab&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;currentTab&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;currentTab&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;13. Switch to the previous tab&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;global&lt;/span&gt; &lt;span class="n"&gt;previousTab&lt;/span&gt;
&lt;span class="k"&gt;global&lt;/span&gt; &lt;span class="n"&gt;currentTab&lt;/span&gt;
&lt;span class="n"&gt;previousTab&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;currentTab&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;switch_to_window&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;window_handles&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;previousTab&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;currentTab&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;currentTab&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;14. Close tab&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;15. Close alert&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;switch_to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;accept&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;16. Refresh&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;refresh&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;17. Hover&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;the_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"register"&lt;/span&gt;
&lt;span class="n"&gt;the_element&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find_element_by_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;the_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;hover&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ActionChains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;move_to_element&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;the_element&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;hover&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;perform&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;18. Right Click&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;the_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"register"&lt;/span&gt;
&lt;span class="n"&gt;the_element&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find_element_by_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;the_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;right_click&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ActionChains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;context_click&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;the_element&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;right_click&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;perform&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;19. Click with offset&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;In order to precisely click on a certain position in a canvas element, you have to provide the offset.&lt;/p&gt;

&lt;p&gt;The offset represents the number of pixels to the right and down, starting from the top left corner of your canvas element.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;the_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"register"&lt;/span&gt;
&lt;span class="n"&gt;the_element&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find_element_by_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;the_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;
&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;
&lt;span class="n"&gt;offset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ActionChains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;move_to_element_with_offset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;the_element&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;click&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;perform&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can read how to do this with Endtest &lt;a href="https://endtest.io/guides/docs/dealing-with-canvas-elements/"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;20. Press Key&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;the_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'register'&lt;/span&gt;
&lt;span class="n"&gt;element&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find_element_by_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;the_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;send_keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Keys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RETURN&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;21. Drag and drop&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;element_to_drag_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'ball'&lt;/span&gt;
&lt;span class="n"&gt;target_element_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'goal'&lt;/span&gt;
&lt;span class="n"&gt;element_to_drag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find_element_by_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;element_to_drag_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;target_element&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find_element_by_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;target_element_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ActionChains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;drag_and_drop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;element_to_drag_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target_element&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;perform&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;22. Get Page Source&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;the_page_source&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;page_source&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;23. Get Cookies&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;cookies_list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_cookies&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;24. Delete Cookies&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;cookie_item&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'shopping_cart'&lt;/span&gt;
&lt;span class="c1"&gt;# delete one cookie
&lt;/span&gt;&lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;delete_cookie&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cookie_item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# delete all cookies
&lt;/span&gt;&lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;delete_all_cookies&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;25. Get first element from list&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;the_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'register'&lt;/span&gt;
&lt;span class="n"&gt;list_of_elements&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find_elements_by_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;the_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;first_element&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;list_of_elements&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;26. Configure Page Load Timeout&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_page_load_timeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;27. Configure Element Load Timeout&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;selenium.webdriver.support.ui&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;WebDriverWait&lt;/span&gt;

&lt;span class="n"&gt;the_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'register'&lt;/span&gt;
&lt;span class="n"&gt;WebDriverWait&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;until&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;EC&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;presence_of_element_located&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;By&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;the_id&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;28. Set window size&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_window_size&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;29. Change the user agent string&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;the_user_agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'hello'&lt;/span&gt;
&lt;span class="n"&gt;chromedriver&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'C:/tests/chromedriver.exe'&lt;/span&gt;
&lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;webdriver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ChromeOptions&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'--user-agent = '&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;the_user_agent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;driver&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;webdriver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Chrome&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
   &lt;span class="n"&gt;executable_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;chromedriver&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
   &lt;span class="n"&gt;chrome_options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;30. Simulate webcam and microphone&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;chromedriver&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'C:/tests/chromedriver.exe'&lt;/span&gt;
&lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;webdriver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ChromeOptions&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"--use-fake-ui-for-media-stream"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"--use-fake-device-for-media-stream"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;driver&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;webdriver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Chrome&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
   &lt;span class="n"&gt;executable_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;chromedriver&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
   &lt;span class="n"&gt;chrome_options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;31. Add Chrome Extension&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;chromedriver&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'C:/tests/chromedriver.exe'&lt;/span&gt;
&lt;span class="n"&gt;extension_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'C:/tests/my_extension.zip'&lt;/span&gt;
&lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;webdriver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ChromeOptions&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_extension&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;extension_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;driver&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;webdriver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Chrome&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
   &lt;span class="n"&gt;executable_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;chromedriver&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
   &lt;span class="n"&gt;chrome_options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;32. Emulate mobile device&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;google_pixel_3_xl_user_agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'Mozilla/5.0 (Linux; Android 9.0; Pixel 3 XL Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.98 Mobile Safari/537.36'&lt;/span&gt;
&lt;span class="n"&gt;pixel_3_xl_emulation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="s"&gt;"deviceMetrics"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s"&gt;"width"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;411&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
      &lt;span class="s"&gt;"height"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;731&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
      &lt;span class="s"&gt;"pixelRatio"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
   &lt;span class="p"&gt;},&lt;/span&gt;
   &lt;span class="s"&gt;"userAgent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;google_pixel_3_xl_user_agent&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;webdriver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ChromeOptions&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_experimental_option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"mobileEmulation"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pixel_3_xl_emulation&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;driver&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;webdriver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Chrome&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
   &lt;span class="n"&gt;executable_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;chromedriver&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
   &lt;span class="n"&gt;chrome_options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I ♥️ Selenium, but I use &lt;strong&gt;&lt;a href="https://endtest.io"&gt;Endtest&lt;/a&gt;&lt;/strong&gt; instead.&lt;/p&gt;

&lt;p&gt;It has so many features, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chrome extension to record your tests&lt;/li&gt;
&lt;li&gt;Access to a cloud with real browsers on Windows and macOS machines&lt;/li&gt;
&lt;li&gt;Access to real mobile devices&lt;/li&gt;
&lt;li&gt;Detailed logs&lt;/li&gt;
&lt;li&gt;Screenshot comparison&lt;/li&gt;
&lt;li&gt;Live video of test executions&lt;/li&gt;
&lt;li&gt;Video recording of test executions&lt;/li&gt;
&lt;li&gt;Data-driven testing with CSV files&lt;/li&gt;
&lt;li&gt;Scheduler&lt;/li&gt;
&lt;li&gt;Automatic backups&lt;/li&gt;
&lt;li&gt;Endtest API&lt;/li&gt;
&lt;li&gt;Email notifications&lt;/li&gt;
&lt;li&gt;Slack notifications&lt;/li&gt;
&lt;li&gt;Webhook notifications&lt;/li&gt;
&lt;li&gt;Endtest Mailbox &lt;/li&gt;
&lt;li&gt;Different geolocations (🇺🇸🇩🇪🇬🇧🇫🇷🇦🇺🇯🇵)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And the &lt;a href="https://endtest.io/guides/docs/how-to-create-web-tests/"&gt;Documentation&lt;/a&gt; section is a gold mine. 🤓&lt;/p&gt;

</description>
      <category>testing</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>The Nastiest Bugs I've Ever Encountered </title>
      <dc:creator>Klaus</dc:creator>
      <pubDate>Mon, 02 Dec 2019 14:35:02 +0000</pubDate>
      <link>https://forem.com/razgandeanu/the-nastiest-bugs-i-ve-ever-encountered-42fj</link>
      <guid>https://forem.com/razgandeanu/the-nastiest-bugs-i-ve-ever-encountered-42fj</guid>
      <description>&lt;p&gt;We all know it: &lt;/p&gt;

&lt;p&gt;Bugs. Are. Nasty. &lt;/p&gt;

&lt;p&gt;I use &lt;strong&gt;&lt;a href="https://endtest.io" rel="noopener noreferrer"&gt;Endtest&lt;/a&gt;&lt;/strong&gt; to quickly create Automated Tests and execute them on the cross-browser cloud.&lt;/p&gt;

&lt;p&gt;You should check out the &lt;strong&gt;&lt;a href="https://endtest.io/guides/docs/how-to-create-web-tests/" rel="noopener noreferrer"&gt;docs&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here are the nastiest bugs I've missed and the lessons they taught me: &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;1. The $0.00 price on all invoices&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;A few years ago, I was working for this online retail company. &lt;/p&gt;

&lt;p&gt;Most of the flows there were automated.&lt;/p&gt;

&lt;p&gt;When a user would place an order on the site, the products would be picked up from the warehouse and the invoice would be generated and printed automatically.&lt;/p&gt;

&lt;p&gt;The bug crawled from under a change made by a colleague, in a completely different section of the platform.&lt;/p&gt;

&lt;p&gt;We only tested around the change and then we released it.&lt;/p&gt;

&lt;p&gt;They called us from the warehouse to tell us that all the printed invoices have $0.00 on them.&lt;/p&gt;

&lt;p&gt;Surprisingly, no one got fired.&lt;/p&gt;

&lt;p&gt;We didn't have automated functional tests back then, we only had unit tests.&lt;/p&gt;

&lt;p&gt;I wish I had a tool like &lt;a href="https://endtest.io" rel="noopener noreferrer"&gt;Endtest&lt;/a&gt; back then.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What lesson did I learn?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Testing around the change is only useful to find out if your change works as expected.&lt;/p&gt;

&lt;p&gt;No one can predict how a change might affect other areas of the software.&lt;/p&gt;

&lt;p&gt;Never release anything, without executing the regression test suites.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;2. The phantom server&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Another company: we were working on this functionality that could execute scheduled jobs for the users, pretty much like cron-as-a-service. &lt;/p&gt;

&lt;p&gt;The users could pick a time for their scheduled job, we had a cron on our side that would run every minute, picking up the jobs that were scheduled for that specific time and executing them. &lt;/p&gt;

&lt;p&gt;  So, we decided to spin up a production clone, to test the release there.  &lt;/p&gt;

&lt;p&gt;After the release, users were complaining that their scheduled jobs were being executed twice.  &lt;/p&gt;

&lt;p&gt;We spent a few days looking through the entire code, we added patches with extra checks.  &lt;/p&gt;

&lt;p&gt;We even modified values from the server configuration!  &lt;/p&gt;

&lt;p&gt;Nothing fixed it. &lt;/p&gt;

&lt;p&gt;I looked for similar issues on Stack Overflow, until I found an answer from someone saying that maybe it’s coming from a different instance. &lt;/p&gt;

&lt;p&gt;“Yeah…right, wish it was that easy!” &lt;/p&gt;

&lt;p&gt; And then it hit me: we forgot to disable the cron on the production clone…and we also forgot to take down the production clone. &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What lesson did I learn?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Sometimes, the trees prevent you from seeing the forest. &lt;/p&gt;

&lt;p&gt; That’s why you need a structured approach for testing. &lt;/p&gt;

&lt;p&gt; Make a checklist, write some test cases, but make sure to do it before you actually start testing. &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;3. The million-dollar input&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This other company that I worked for had contracts with all sorts of government agencies, contracts worth billions of dollars. &lt;br&gt;
 &lt;br&gt;
Each delivery phase, obviously, had a deadline. &lt;/p&gt;

&lt;p&gt;The penalties for not delivering the software on time were significant. &lt;br&gt;
The company tried to keep things as cheap as possible, with as few employees as possible; this lead to patches being added hours before the UAT sessions. &lt;/p&gt;

&lt;p&gt;In case you’re not familiar with the term, &lt;em&gt;User Acceptance Testing (UAT), also known as beta or end-user testing, is defined as testing the software by the user or client to determine whether it can be accepted or not.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;These sessions were critical, consisting of guiding a lot of government big shots through the process of checking if the system works. &lt;/p&gt;

&lt;p&gt;You had to book these weeks in advance, to find a window in their busy schedule. &lt;/p&gt;

&lt;p&gt;If a significant issue was found, they wouldn’t sign the documents and the penalties would be applied. &lt;/p&gt;

&lt;p&gt;Of course, we were smart enough to have automated tests and I was the one writing them. &lt;/p&gt;

&lt;p&gt;As it was a web application, I just used Selenium and executed them the browsers from my own Windows machine, Internet Explorer included. &lt;/p&gt;

&lt;p&gt; We also had a DevOps guy there, who insisted that the tests should be executed from our Jenkins and run there.  &lt;/p&gt;

&lt;p&gt;I didn’t even know that was possible, and he mumbled something about a headless Chrome browser on a Linux machine. &lt;/p&gt;

&lt;p&gt;A patch was added, one day before the UAT. &lt;/p&gt;

&lt;p&gt;We were confident, because the automated tests were checking that area, the full regression didn’t reveal any issues. &lt;/p&gt;

&lt;p&gt;First day of the UAT: everyone noticed an issue where a form couldn’t be submitted, due to some broken input. &lt;/p&gt;

&lt;p&gt;Our response?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Just clear your browser cache.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Still not working.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Let me check.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Oh, this is bad.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That penalty was close to one million dollars.  &lt;/p&gt;

&lt;p&gt;Good news is that the company was prepared for that possibility from the start, so it wasn’t a tragedy. &lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;What lesson did I learn?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Always test in real conditions. Always. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fumlwesd65rjg2duzs3th.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fumlwesd65rjg2duzs3th.jpg" alt="headless chrome testing"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you’re going to test on a headless browser on some Linux machine, you are taking a risk. &lt;/p&gt;

&lt;p&gt;If you are using some cloud solution providing a Chrome browser without telling you which OS it runs on, it’s probably a headless browser on some Linux machine.  &lt;/p&gt;

&lt;p&gt;At the company I currently work for, we use &lt;a href="https://endtest.io" rel="noopener noreferrer"&gt;Endtest&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;It provides real browsers on Windows and macOS machines. &lt;br&gt;
Honestly, it does help me sleep at night.  I wouldn’t know if it’s the right tool for you, but for us it did wonders. &lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/g0lF_95-tLQ"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;What are the ugliest bugs YOU missed? &lt;/p&gt;

&lt;p&gt;I’m looking forward to hearing other stories. &lt;/p&gt;

</description>
      <category>testing</category>
      <category>webdev</category>
      <category>career</category>
    </item>
    <item>
      <title>The Best Software Testing Tools</title>
      <dc:creator>Klaus</dc:creator>
      <pubDate>Mon, 14 Oct 2019 14:59:48 +0000</pubDate>
      <link>https://forem.com/razgandeanu/the-best-software-testing-tools-2ofc</link>
      <guid>https://forem.com/razgandeanu/the-best-software-testing-tools-2ofc</guid>
      <description>&lt;h3&gt;
  
  
  &lt;strong&gt;Introduction&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Most of us neglect testing. &lt;/p&gt;

&lt;p&gt;We lower the priority until there's no more time left for it.&lt;/p&gt;

&lt;p&gt;And who can blame us? It's hard. It's meticulous.&lt;/p&gt;

&lt;p&gt;But it doesn't have to be. &lt;/p&gt;

&lt;p&gt;There are libraries and tools out there that make it almost enjoyable.&lt;/p&gt;

&lt;h1&gt;
  
  
  1. Endtest
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://endtest.io" rel="noopener noreferrer"&gt;Endtest&lt;/a&gt;&lt;/strong&gt; is fun to use. &lt;/p&gt;

&lt;p&gt;It reduces the complexity of Automated Testing to the minimum.&lt;/p&gt;

&lt;p&gt;You can a create a useful functional test in a few minutes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F6j2un44suto2w2ew1kev.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F6j2un44suto2w2ew1kev.png" alt="Endtest"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And you can do that without even having to code. &lt;/p&gt;

&lt;h1&gt;
  
  
  2. BrowserStack
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://browserstack.com" rel="noopener noreferrer"&gt;BrowserStack&lt;/a&gt;&lt;/strong&gt; is king when it comes to Manual Testing.&lt;/p&gt;

&lt;p&gt;You can use it to quickly spin up a machine with any browser you want.&lt;/p&gt;

&lt;p&gt;You no longer have to bother the weird guy in your team who uses Windows.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fcn9h0lu3m8y2yu7s9v8x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fcn9h0lu3m8y2yu7s9v8x.png" alt="BrowserStack"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  3. Postman
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.getpostman.com" rel="noopener noreferrer"&gt;Postman&lt;/a&gt;&lt;/strong&gt; is the best way to test your APIs. &lt;/p&gt;

&lt;p&gt;Side note: &lt;/p&gt;

&lt;p&gt;Don't you just love their artwork?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F3i7z2ysc97bezifj7ddf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F3i7z2ysc97bezifj7ddf.png" alt="Postman"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>html</category>
      <category>testing</category>
    </item>
    <item>
      <title>Endtest can do that?</title>
      <dc:creator>Klaus</dc:creator>
      <pubDate>Wed, 09 Oct 2019 15:36:13 +0000</pubDate>
      <link>https://forem.com/razgandeanu/endtest-can-do-that-4i17</link>
      <guid>https://forem.com/razgandeanu/endtest-can-do-that-4i17</guid>
      <description>&lt;h3&gt;
  
  
  &lt;strong&gt;Introduction&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://endtest.io"&gt;Endtest&lt;/a&gt;&lt;/strong&gt; is the bee's knees when it comes to Automated Testing.&lt;/p&gt;

&lt;p&gt;But you might encounter devs who think it's just a &lt;strong&gt;Record &amp;amp; Playback&lt;/strong&gt; tool.&lt;/p&gt;

&lt;p&gt;It's amazing that you can do so much with this platform.&lt;/p&gt;

&lt;h1&gt;
  
  
  1. Test Emails
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--z_E4W493--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/7tde9hzr8k3lbaejmrnq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--z_E4W493--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/7tde9hzr8k3lbaejmrnq.png" alt="Endtest Mailbox"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://endtest.io/mailbox"&gt;Endtest Mailbox&lt;/a&gt;&lt;/strong&gt; is a sweet and secure way to get an instant disposable email address.&lt;/p&gt;

&lt;p&gt;You can access the inbox for that email address directly on that page by adding the email parameter in the URL.&lt;/p&gt;

&lt;p&gt;Dead simple.&lt;/p&gt;

&lt;h1&gt;
  
  
  2. If Statements and Loops
&lt;/h1&gt;

&lt;p&gt;Your neophobic colleague who hates everything except Linux and Java might dismiss a codeless solution such as Endtest stating that it cannot offer the same flexibility as programming. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CwGRGRGY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/bnj5wnga0xgnx5e4n6mt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CwGRGRGY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/bnj5wnga0xgnx5e4n6mt.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now you know that he's wrong.&lt;/p&gt;

&lt;h1&gt;
  
  
  3. Execute Tests in Real Browsers on Windows and macOS Machines
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bZCCOQ09--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/dpye6ozslse63wtkgv6r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bZCCOQ09--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/dpye6ozslse63wtkgv6r.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There is no greater facepalm then when a dev is shocked to find out that his creation works on his instance of Chromium on Linux and doesn't work on the client's regular Chrome on macOS or Windows. &lt;/p&gt;

&lt;p&gt;Sure, Igor might have worked 7 months on designing those tests that run in a headless browser on some container. But that doesn't help anyone.&lt;/p&gt;

&lt;p&gt;Everyone in the industry insists that it's a bad practice. &lt;/p&gt;

&lt;p&gt;Real users use real browsers, get that in your head. &lt;/p&gt;

&lt;h1&gt;
  
  
  4. Variables
&lt;/h1&gt;

&lt;p&gt;Either with values defined by you or generated randomly based on your rules and preferences. &lt;/p&gt;

&lt;p&gt;They can also be concatenated.&lt;/p&gt;

&lt;p&gt;Get them in the autocomplete, similar to how it happens in an IDE:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IWyJMcJY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/scyofsn1zzwmotk5av25.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IWyJMcJY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/scyofsn1zzwmotk5av25.png" alt="Endtest Variables"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  5. Test PDF Files
&lt;/h1&gt;

&lt;p&gt;I encountered a bug once where all the prices on the invoices were &lt;strong&gt;$0.00&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It was scary.&lt;/p&gt;

&lt;p&gt;You can view a PDF inside in a browser, that means that you can also test it in the browsers from the Endtest cloud.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pFgsht__--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/asnocw7tmya4d3rzenhh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pFgsht__--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/asnocw7tmya4d3rzenhh.png" alt="Endtest PDF"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  6. Inspect Elements in Mobile Apps
&lt;/h1&gt;

&lt;p&gt;Unlike websites, where you can just use the Chrome Developer Tools to inspect any element from the DOM, inspecting elements in Mobile Apps wasn't easy before.&lt;/p&gt;

&lt;p&gt;You'd had to fetch the page source and squint in that XML until you found the corresponding tag for your element. &lt;/p&gt;

&lt;p&gt;Now, you can use the Element Inspector from Endtest and get the job done.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--inosBK7x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/e5cd1usugadn99ivkvhc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--inosBK7x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/e5cd1usugadn99ivkvhc.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Works for both Android and iOS, native and hybrid.&lt;/p&gt;

&lt;h1&gt;
  
  
  7. Notifications on Email and Slack
&lt;/h1&gt;

&lt;p&gt;Wouldn't it be nice if you just got an email when a test failed?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EMDadK0A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ncwy3flecdq6106tuxy3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EMDadK0A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ncwy3flecdq6106tuxy3.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  8. Pixel by Pixel Screenshot Comparison
&lt;/h1&gt;

&lt;p&gt;No &lt;strong&gt;Element is present&lt;/strong&gt; assertion can tell you if a section visually matches your expectations, you still need some &lt;strong&gt;eyes&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0jmRV-J2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/84kzxqs7q1g0ljykj7xz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0jmRV-J2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/84kzxqs7q1g0ljykj7xz.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And you have the flexibility to set the Tolerance for that.&lt;/p&gt;

&lt;h1&gt;
  
  
  9. Video Recording
&lt;/h1&gt;

&lt;p&gt;The video is available as soon as a test execution is finished.&lt;br&gt;
You can even choose to see Live Video during the test execution:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--s2xw868p--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/gmqqzeevia7vithwaodo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--s2xw868p--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/gmqqzeevia7vithwaodo.png" alt="Endtest Live Video"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  10. Scheduler
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0Bfb495Y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/j83gi5j6v3c9pk3qlj29.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0Bfb495Y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/j83gi5j6v3c9pk3qlj29.png" alt="Endtest Scheduler"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You want your tests to run on a schedule. &lt;/p&gt;

&lt;p&gt;Use the Endtest API to configure the jobs in Jenkins or just use the built-in Scheduler. &lt;/p&gt;

&lt;h1&gt;
  
  
  11. Versioning and Backups
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JhW53dXs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/q3vengo2zuzb1h69ht0w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JhW53dXs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/q3vengo2zuzb1h69ht0w.png" alt="Endtest Backups"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Go back in time to any version, nothing ever gets lost.&lt;/p&gt;

&lt;h1&gt;
  
  
  12. Test File Uploads
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--R4SQQB3o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/n4tm8vjkkd4jditi5jso.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--R4SQQB3o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/n4tm8vjkkd4jditi5jso.png" alt="Endtest Upload FIle"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Executing Automated Tests on a cross-browser cloud doesn't mean that you can't also upload files in your test. &lt;/p&gt;

&lt;p&gt;Store them in the Endtest Drive, fast and secure.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XO6opayF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/h5989hq5h146xhdy4bkf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XO6opayF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/h5989hq5h146xhdy4bkf.png" alt="Endtest Drive"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  13. Execute SQL Queries
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--y20gY5hn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ma24tio7xpdm3boz7b75.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--y20gY5hn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ma24tio7xpdm3boz7b75.png" alt="Endtest SQL"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Securely connect to your database and do your SQL magic.&lt;/p&gt;

&lt;p&gt;Useful for generating or clearing test data. Or even for assertions.&lt;/p&gt;

&lt;h1&gt;
  
  
  14. Execute JavaScript
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--12BrZYsu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/kbj0739mwo93yhgayyvg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--12BrZYsu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/kbj0739mwo93yhgayyvg.png" alt="Endtest JavaScript"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Everyone needs a little bit of JavaScript in their tests from time to time.&lt;/p&gt;

&lt;h1&gt;
  
  
  15. Browser Logs
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--33ZvUlUH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/uee57uldcxcvysnxosod.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--33ZvUlUH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/uee57uldcxcvysnxosod.png" alt="Endtest Browser Logs"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Did you ever check the browser logs in an Automated Test? &lt;/p&gt;

&lt;p&gt;Really? Never? &lt;/p&gt;

&lt;p&gt;Me neither, but I hear that it's a good practice. &lt;/p&gt;

&lt;p&gt;At least you always get them in the logs for each test execution.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LZVwK5td--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/jhl724e58a9b7435mus4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LZVwK5td--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/jhl724e58a9b7435mus4.png" alt="Endtest Logs"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  16. Collaborate
&lt;/h1&gt;

&lt;p&gt;You don't need Git or SVN to grant access to your tests.&lt;/p&gt;

&lt;p&gt;Everything is already in the cloud, use the Collaboration module.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BANL4lH6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/dekslg4xavmlolyxs20f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BANL4lH6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/dekslg4xavmlolyxs20f.png" alt="Endtest Collaboration"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  17. Multiple Tabs, iframes, Alert Boxes
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Bo7vxuWE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/sp3oe6we1abbcvuw8o41.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Bo7vxuWE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/sp3oe6we1abbcvuw8o41.png" alt="Endtest Tabs Iframe Alert"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Check. Check. Check.&lt;/p&gt;

&lt;h1&gt;
  
  
  18. Complex Gestures on Mobile
&lt;/h1&gt;

&lt;p&gt;Tap it. Zoom it. Swipe it. &lt;/p&gt;

&lt;p&gt;The engine for Mobile Tests is powered by Appium and can get the job done.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DCDGqYJ5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/2x1zgcr3ujnaqkqfdfql.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DCDGqYJ5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/2x1zgcr3ujnaqkqfdfql.png" alt="Endtest Touch"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>html</category>
      <category>testing</category>
      <category>android</category>
    </item>
    <item>
      <title>How to use the Element Inspector for Mobile Apps</title>
      <dc:creator>Klaus</dc:creator>
      <pubDate>Mon, 07 Oct 2019 13:58:47 +0000</pubDate>
      <link>https://forem.com/razgandeanu/how-to-use-the-element-inspector-for-mobile-apps-2mc7</link>
      <guid>https://forem.com/razgandeanu/how-to-use-the-element-inspector-for-mobile-apps-2mc7</guid>
      <description>&lt;h3&gt;
  
  
  &lt;strong&gt;Introduction&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;It's a known fact: locating elements in Mobile Applications is a hassle.&lt;/p&gt;

&lt;p&gt;Appium and other libraries require locators such as ID, Accessibility ID, Name, Class Name, XPath, etc. &lt;/p&gt;

&lt;p&gt;And getting those locators is difficult, because unlike web sites, we can't just Right Click and go into the Chrome Developer Tools.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The old way&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;A painful process that involves the following steps:&lt;/p&gt;

&lt;h4&gt;
  
  
  1) Get the Page Source.
&lt;/h4&gt;

&lt;h4&gt;
  
  
  2) Look through the tags and find your element.
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IHp-ZjSx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/jpfnft9vo66snw40r5hm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IHp-ZjSx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/jpfnft9vo66snw40r5hm.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  3) Extract a locator based on the Appium rules.
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EqZbS0Co--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/uvmmazrj1ujlz8lzlqoh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EqZbS0Co--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/uvmmazrj1ujlz8lzlqoh.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  4) If no reliable locator is found, write the XPath by hand.
&lt;/h4&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The new way, using the Element Inspector&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://endtest.io"&gt;Endtest&lt;/a&gt;&lt;/strong&gt; just added the &lt;strong&gt;Get Element Inspector&lt;/strong&gt; action, which extracts the structure of Android and iOS apps and generates a HTML page like &lt;strong&gt;&lt;a href="https://s3-us-west-2.amazonaws.com/endtest-tests/BpvbTth1n4G1uwi0KGG6Ty2BlWXjlD/Element_Inspector_1.html"&gt;this&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Steps:&lt;/p&gt;

&lt;h4&gt;
  
  
  1) Add a Get Element Inspector step.
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RbF3DJ_z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/2cby64ng5ivgg5a7np6u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RbF3DJ_z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/2cby64ng5ivgg5a7np6u.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  2) The execution will generate a HTML with the structure of the app:
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SmMXm5fN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/tzzqj14pmrj6kj2849sv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SmMXm5fN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/tzzqj14pmrj6kj2849sv.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  3) Click on an element and you'll get all the locators and attributes.
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--inosBK7x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/e5cd1usugadn99ivkvhc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--inosBK7x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/e5cd1usugadn99ivkvhc.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It works for Android and iOS apps, native and hybrid.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/TB0qEnuHu90"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;You can read more about it in their docs:&lt;br&gt;
&lt;a href="https://endtest.io/guides/docs/finding-elements-in-mobile-applications/"&gt;Finding elements in Mobile Applications&lt;/a&gt;&lt;/p&gt;

</description>
      <category>testing</category>
      <category>tutorial</category>
      <category>android</category>
    </item>
    <item>
      <title>How to integrate Endtest with BrowserStack</title>
      <dc:creator>Klaus</dc:creator>
      <pubDate>Wed, 25 Sep 2019 14:25:54 +0000</pubDate>
      <link>https://forem.com/endtest/how-to-integrate-endtest-with-browserstack-2gkj</link>
      <guid>https://forem.com/endtest/how-to-integrate-endtest-with-browserstack-2gkj</guid>
      <description>&lt;h3&gt;
  
  
  &lt;strong&gt;Introduction&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://endtest.io" rel="noopener noreferrer"&gt;Endtest&lt;/a&gt; allows you to create, manage and execute Automated Tests, without having to write any code. &lt;/p&gt;

&lt;p&gt;By integrating with &lt;a href="https://www.browserstack.com/" rel="noopener noreferrer"&gt;BrowserStack&lt;/a&gt;, you can execute Mobile Tests created with Endtest on a range of real Android and iOS mobile devices offered by BrowserStack.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Getting Started&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;1) Go to your &lt;strong&gt;BrowserStack&lt;/strong&gt; account.&lt;br&gt;
2) Click on &lt;strong&gt;App Automate&lt;/strong&gt; from the &lt;strong&gt;Products&lt;/strong&gt; section:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fpa2x1o3afik565slagjr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fpa2x1o3afik565slagjr.png" alt="BrowserStack App Automate"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3) Click on the &lt;strong&gt;Show&lt;/strong&gt; button from the &lt;strong&gt;Username and Access Keys&lt;/strong&gt; section from the left side of the page:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fisjvsfcdhd57sqkaymb0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fisjvsfcdhd57sqkaymb0.png" alt="BrowserStack App Automate"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4) Go to the &lt;strong&gt;Settings&lt;/strong&gt; page from &lt;a href="https://endtest.io" rel="noopener noreferrer"&gt;Endtest&lt;/a&gt;.&lt;br&gt;
5) Add the &lt;strong&gt;Username&lt;/strong&gt; and &lt;strong&gt;Access Key&lt;/strong&gt; from BrowserStack App Automate in the BrowserStack User and BrowserStack Key inputs from the Endtest Settings page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F6pf5qsifvp6nqhkawouz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F6pf5qsifvp6nqhkawouz.png" alt="Endtest BrowserStack"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;6) Click on the &lt;strong&gt;Save&lt;/strong&gt; button.&lt;/p&gt;

&lt;p&gt;Nice job! Your Endtest account is now connected with your BrowserStack account.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Running your first test&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;1) Upload your APK or IPA file in the &lt;strong&gt;Drive&lt;/strong&gt; section from Endtest.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F0fmm95fgewc7c6xhlnmy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F0fmm95fgewc7c6xhlnmy.png" alt="Endtest Drive"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2) After that, go to the &lt;strong&gt;Mobile Tests&lt;/strong&gt; section and click on the Run button.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F5w45idfu6aep1dp2iqgk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F5w45idfu6aep1dp2iqgk.png" alt="Endtest Execution"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3) Select &lt;strong&gt;BrowserStack&lt;/strong&gt; from the &lt;strong&gt;Grid&lt;/strong&gt; dropdown.&lt;/p&gt;

&lt;p&gt;4) Select the &lt;strong&gt;Platform&lt;/strong&gt; and the &lt;strong&gt;Real Device&lt;/strong&gt; on which you want to execute your test on.&lt;/p&gt;

&lt;p&gt;5) Select your APK file in the &lt;strong&gt;APK Download URL&lt;/strong&gt; input.&lt;br&gt;
If you select an iOS device, the &lt;strong&gt;APK Download URL&lt;/strong&gt; input would be replaced with the &lt;strong&gt;IPA Download URL&lt;/strong&gt; input.&lt;/p&gt;

&lt;p&gt;After starting the test execution, you will be redirected to the Results section where you'll get live video and all the results, logs and details in real-time.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>testing</category>
      <category>productivity</category>
      <category>devops</category>
    </item>
    <item>
      <title>5 Miraculous Tools for Devs Who Want to Test</title>
      <dc:creator>Klaus</dc:creator>
      <pubDate>Wed, 25 Sep 2019 13:14:43 +0000</pubDate>
      <link>https://forem.com/razgandeanu/5-miraculous-tools-for-devs-who-want-to-test-2688</link>
      <guid>https://forem.com/razgandeanu/5-miraculous-tools-for-devs-who-want-to-test-2688</guid>
      <description>&lt;p&gt;Testing, as we all know, is what saves us a lot of trouble.&lt;br&gt;
But not everyone is using the same tools or know all of the great ones out there that help make your testing more successful.&lt;/p&gt;

&lt;p&gt;Don't fall into the stereotype of the stubborn dev who relies entirely on unit tests. You might regret it, sooner than you think.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;1. &lt;a href="https://endtest.io" rel="noopener noreferrer"&gt;Endtest&lt;/a&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;A platform that allows you to create, manage and run Automated Tests for Web Applications and Native Mobile Apps (Android &amp;amp; iOS), without having to write any code.&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/4DIVKcs--TA"&gt;
&lt;/iframe&gt;
&lt;br&gt;
Some of the features:&lt;br&gt;
• Cross-browser grid, running on Windows and macOS machines&lt;br&gt;
• Codeless Editor for Automated Tests&lt;br&gt;
• Support for Web Applications&lt;br&gt;
• Support for both native and hybrid Android and iOS apps&lt;br&gt;
• Video recordings for test executions&lt;br&gt;
• Detailed logs&lt;br&gt;
• Chrome extension to record web tests&lt;br&gt;
• Element Inspector for mobile apps&lt;br&gt;
• Screenshot comparison&lt;br&gt;
• Data-driven testing with CSV files&lt;br&gt;
• Geolocation&lt;br&gt;
• Email, Slack and Webhook notifications&lt;br&gt;
• If Statements and Loops&lt;br&gt;
• Variables and re-usable components&lt;br&gt;
• Support for file uploads in the tests&lt;br&gt;
• An Endtest API, for integration with CI/CD systems&lt;br&gt;
• Advanced Assertions&lt;br&gt;
• Endtest Mailbox, for testing emails&lt;br&gt;
• Self-healing tests&lt;/p&gt;

&lt;p&gt;This is the Codeless Test Editor:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fknvgfp5s11npi74qx3ir.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fknvgfp5s11npi74qx3ir.png" alt="Endtest Codeless Editor"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is what it looks like when you want to execute a test:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fku9gwet2genzvkp10r5n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fku9gwet2genzvkp10r5n.png" alt="Endtest UI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And these are the detailed logs from a test execution:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F5717ka5bwovmlb8xduzt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F5717ka5bwovmlb8xduzt.png" alt="Endtest Results"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Their &lt;a href="https://endtest.io/guides/docs/how-to-create-web-tests/" rel="noopener noreferrer"&gt;Documentation&lt;/a&gt; is fantastic. Lots of examples and videos.&lt;/p&gt;

&lt;p&gt;You can even run Automated Tests on Real Mobile Devices:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2Fhxu10zo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2Fhxu10zo.png" alt="endtest mobile"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;According to their Twitter account, they seem to be adding new features every week:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fanwh5kg0qpnpmc29jshf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fanwh5kg0qpnpmc29jshf.png" alt="endtest twitter"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;2. &lt;a href="https://www.getpostman.com/.io" rel="noopener noreferrer"&gt;Postman&lt;/a&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The easiest way to test any API.&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/YKalL1rVDOE"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.getpostman.com/.io" rel="noopener noreferrer"&gt;Postman&lt;/a&gt; has evolved in the last few years and is now a complete solution for monitoring the health of your APIs.&lt;/p&gt;

&lt;p&gt;Some of the features:&lt;br&gt;
• API Client&lt;br&gt;
• Request Chaining&lt;br&gt;
• Data Security&lt;br&gt;
• Traffic Control&lt;br&gt;
• Orchestration&lt;br&gt;
• Logs/Documentation&lt;br&gt;
• API Monitoring&lt;br&gt;
• Monetization&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fazzzrbaaf4j1zaq1zpjn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fazzzrbaaf4j1zaq1zpjn.png" alt="Postman"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;3. &lt;a href="https://litmus.com/" rel="noopener noreferrer"&gt;Litmus&lt;/a&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;You can use Litmus to build, test, and monitor emails. &lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/fbyGwZtaeKo"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;What's interesting for us is the ability to open an email in the multitude of email clients on their side.  &lt;/p&gt;

&lt;p&gt;Want to know how your email looks in Outlook 2013 or in Apple Mail?&lt;/p&gt;

&lt;p&gt;All you have to do is fetch a temporary email address from &lt;a href="https://litmus.com/" rel="noopener noreferrer"&gt;Litmus&lt;/a&gt; and send your email there. &lt;/p&gt;

&lt;p&gt;You'll be able to view that in the email clients directly on their site.&lt;/p&gt;

&lt;p&gt;Test your emails and you might avoid embarrassing situations like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F787p9rscf7xz2h8ghvrj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F787p9rscf7xz2h8ghvrj.png" alt="Email testing"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fcs786ev6r5yg5228rtv8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fcs786ev6r5yg5228rtv8.png" alt="Email testing"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;4. &lt;a href="https://jmeter.apache.org/" rel="noopener noreferrer"&gt;Apache JMeter&lt;/a&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The best tool to perform load testing and to measure performance.&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/mXGcBvWYl-U"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;It was originally designed for testing Web Applications but has since expanded to other test functions.&lt;/p&gt;

&lt;p&gt;You can use it to test SOAP, REST, FTP, Database, LDAP, TCP, SMPT, etc.&lt;/p&gt;

&lt;p&gt;Other features include:&lt;br&gt;
• Full featured Test IDE&lt;br&gt;
• Ability to load test many different applications/server/protocol types &lt;br&gt;
• A complete and ready to present dynamic HTML report&lt;br&gt;
• Extract data from popular response formats (HTML, JSON , XML, etc) &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F8v2yw2h743hkb58cofqg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F8v2yw2h743hkb58cofqg.png" alt="Apache JMeter example"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;5. &lt;a href="https://tools.kali.org/web-applications/grabber" rel="noopener noreferrer"&gt;Grabber&lt;/a&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;A useful web application scanner. &lt;br&gt;
Now you can add Security Testing to your checklist.&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/n52xTEogjEc"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Features include:&lt;br&gt;
• Cross-Site Scripting&lt;br&gt;
• SQL Injection &lt;br&gt;
• File Inclusion&lt;br&gt;
• Backup files check&lt;br&gt;
• Simple AJAX check &lt;br&gt;
• Hybrid analysis/Crystal ball testing for PHP application using PHP-SAT&lt;br&gt;
• JavaScript source code analyzer&lt;br&gt;
• JavaScript with JavaScript Lint&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fj5dgpgoo77q5exz3x82o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fj5dgpgoo77q5exz3x82o.png" alt="Grabber Security"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>testing</category>
      <category>productivity</category>
      <category>devops</category>
    </item>
    <item>
      <title>Finding Elements in iframes with Selenium</title>
      <dc:creator>Klaus</dc:creator>
      <pubDate>Tue, 06 Aug 2019 12:21:58 +0000</pubDate>
      <link>https://forem.com/endtest/finding-elements-in-iframes-with-selenium-6al</link>
      <guid>https://forem.com/endtest/finding-elements-in-iframes-with-selenium-6al</guid>
      <description>&lt;p&gt;Anyone who is using &lt;strong&gt;&lt;a href="https://www.seleniumhq.org/"&gt;Selenium&lt;/a&gt;&lt;/strong&gt; has encountered a scenario where they have to deal with an iframe. &lt;/p&gt;

&lt;p&gt;There is no automatic way of detecting that the element you're looking for is inside an iframe.  &lt;/p&gt;

&lt;p&gt;The error message only says 'Element not found'. &lt;/p&gt;

&lt;p&gt;You're the one who's going to have to look in the Browser Console and figure out that your element is inside an iframe.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--U4GpmfOC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/obteyh9wuqh9milmj0jw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--U4GpmfOC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/obteyh9wuqh9milmj0jw.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's create a test for the &lt;strong&gt;&lt;a href="https://stripe-payments-demo.appspot.com/"&gt;Stripe Payments Demo&lt;/a&gt;&lt;/strong&gt; which has an iframe.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cDrEk8YR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/v0328429z67s2l7cwr5c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cDrEk8YR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/v0328429z67s2l7cwr5c.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'll also be making some comparisons between Selenium and &lt;strong&gt;&lt;a href="https://endtest.io"&gt;Endtest&lt;/a&gt;&lt;/strong&gt;:&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/4DIVKcs--TA"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;An iframe (inline frame) places another HTML document in a frame.&lt;/p&gt;

&lt;p&gt;You need to change the focus of Selenium from one HTML document to another.&lt;/p&gt;

&lt;p&gt;In our case, the only element which is inside the iframe is the &lt;strong&gt;Card&lt;/strong&gt; input.&lt;/p&gt;

&lt;p&gt;I used Python:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;driver.get("&lt;a href="https://stripe-payments-demo.appspot.com%22"&gt;https://stripe-payments-demo.appspot.com"&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;nameElement = driver.find_element_by_name("name")&lt;/em&gt;&lt;br&gt;
&lt;em&gt;emailElement = driver.find_element_by_name("email")&lt;/em&gt;&lt;br&gt;
&lt;em&gt;addressElement = driver.find_element_by_name("address")&lt;/em&gt;&lt;br&gt;
&lt;em&gt;cityElement = driver.find_element_by_name("city")&lt;/em&gt;&lt;br&gt;
&lt;em&gt;stateElement = driver.find_element_by_name("state")&lt;/em&gt;&lt;br&gt;
&lt;em&gt;zipElement = driver.find_element_by_name("postal_code")&lt;/em&gt;&lt;br&gt;
&lt;em&gt;countryElement = driver.find_element_by_name("country")&lt;/em&gt;&lt;br&gt;
&lt;em&gt;iframeElement = driver.find_element_by_name("__privateStripeFrame5")&lt;/em&gt;&lt;br&gt;
&lt;em&gt;cardElement = driver.find_element_by_name("cardnumber)&lt;/em&gt;&lt;br&gt;
&lt;em&gt;submitButton = driver.find_element_by_css_selector("#payment-form &amp;gt; button")&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;nameElement.send_keys("Klaus Werner")&lt;/em&gt;&lt;br&gt;
&lt;em&gt;emailElement.send_keys("&lt;a href="mailto:klaus.werner@example.com"&gt;klaus.werner@example.com&lt;/a&gt;")&lt;/em&gt;&lt;br&gt;
&lt;em&gt;addressElement.send_keys("Random Street")&lt;/em&gt;&lt;br&gt;
&lt;em&gt;cityElement.send_keys("San Francisco")&lt;/em&gt;&lt;br&gt;
&lt;em&gt;stateElement.send_keys("CA")&lt;/em&gt;&lt;br&gt;
&lt;em&gt;zipElement.send_keys("94107")&lt;/em&gt;&lt;br&gt;
&lt;em&gt;countryElement.select_by_value("US")&lt;/em&gt;&lt;br&gt;
&lt;em&gt;driver.switch_to.frame(iframeElement)&lt;/em&gt;&lt;br&gt;
&lt;em&gt;cardElement.send_keys("4111 1111 1111 1111")&lt;/em&gt;&lt;br&gt;
&lt;em&gt;driver.switch_to.default_content()&lt;/em&gt;&lt;br&gt;
&lt;em&gt;submitButton.click()&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Notice how I switched to the iframe before writing in the Card input?&lt;/p&gt;

&lt;p&gt;And I also switched back to the main page after that. &lt;/p&gt;

&lt;p&gt;It's a bit easier to deal with iframes if you're using &lt;strong&gt;&lt;a href="https://endtest.io"&gt;Endtest&lt;/a&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Hc_1j2eo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ffuis31rf1nquye71xpm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Hc_1j2eo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ffuis31rf1nquye71xpm.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Since you're planning to run that test multiple times, you should generate a random email address and store it in a variable. &lt;/p&gt;

&lt;p&gt;You can even test that email with the &lt;strong&gt;&lt;a href="https://endtest.io/mailbox"&gt;Endtest Mailbox&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/K3k-f9vB8Dc"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>testing</category>
      <category>tutorial</category>
      <category>productivity</category>
    </item>
    <item>
      <title> Puppeteer vs Selenium</title>
      <dc:creator>Klaus</dc:creator>
      <pubDate>Mon, 15 Jul 2019 19:55:39 +0000</pubDate>
      <link>https://forem.com/endtest/puppeteer-vs-selenium-1938</link>
      <guid>https://forem.com/endtest/puppeteer-vs-selenium-1938</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;a&gt;Puppeteer&lt;/a&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;a href="https://www.seleniumhq.org/"&gt;Selenium&lt;/a&gt;&lt;/strong&gt; are both popular, powerful and widely used solutions for automating web applications.&lt;/p&gt;

&lt;p&gt;But which one should YOU use?&lt;/p&gt;

&lt;p&gt;The answer depends on your specific needs.&lt;/p&gt;

&lt;p&gt;Choosing the wrong option could delay or worse, sabotage your automated testing project.&lt;/p&gt;

&lt;p&gt;I'll share my own opinion at the end of this article.&lt;/p&gt;

&lt;p&gt;Here are some PROS and CONS for both of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Puppeteer&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;PROS&lt;/strong&gt;&lt;br&gt;
• Faster than Selenium&lt;br&gt;
• Easy to install&lt;br&gt;
• Written and maintained by the Google Chrome devs&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CONS&lt;/strong&gt;&lt;br&gt;
• Works only with Chrome&lt;br&gt;
• The only supported language is Node.js&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;Selenium&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;PROS&lt;/strong&gt;&lt;br&gt;
• Works with most browsers&lt;br&gt;
• Multi-language support&lt;br&gt;
• Huge community of users&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CONS&lt;/strong&gt;&lt;br&gt;
• Difficult to run on all browsers&lt;br&gt;
• A bit slower than Puppeteer&lt;/p&gt;

&lt;p&gt;To sum it up, Puppeteer is faster than Selenium, but it works only with Chrome, while Selenium works with Chrome, Firefox, Safari, Internet Explorer and Edge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Now, for my opinion: both solutions are outdated and built with the narrow mindset of developers who refuse to see beyond their code.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It may sound lazy, but I believe that a solution for automated testing should be like a washing machine: it should give me enough flexibility to choose different inputs and settings, but it shouldn't make me pump the water with one hand and spin the drum with the other. &lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;What both solutions are missing:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;• Video Recording functionality&lt;br&gt;
• Turnkey Machine Learning&lt;br&gt;
• Integrated Email Testing option&lt;br&gt;
• Screenshot Comparison feature&lt;br&gt;
• Automatic Smart Waiting&lt;br&gt;
• Structured results&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Other issues with Selenium and Puppeteer:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;• Difficult to upload files in a test&lt;br&gt;
• Difficult to deal with iframes&lt;br&gt;
• Difficult to integrate with your CI/CD system&lt;br&gt;
• Difficult to configure Element Load Timeout &lt;/p&gt;

&lt;p&gt;If you're looking for a better alternative, try &lt;strong&gt;&lt;a href="https://endtest.io"&gt;Endtest&lt;/a&gt;&lt;/strong&gt;.&lt;br&gt;
It has Puppeteer's speed, it supports Selenium's browsers AND it has all the features that they're missing.&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/4DIVKcs--TA"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>testing</category>
      <category>productivity</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
