<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Selenide: concise UI tests in Java on Selenide</title><link>https://selenide.org/</link><description>Recent content in Selenide: concise UI tests in Java on Selenide</description><generator>Hugo</generator><language>en</language><managingEditor>andrei.solntsev@gmail.com (Andrei Solntsev)</managingEditor><webMaster>andrei.solntsev@gmail.com (Andrei Solntsev)</webMaster><lastBuildDate>Fri, 10 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://selenide.org/rss.xml" rel="self" type="application/rss+xml"/><item><title>Released Selenide 7.16.0</title><link>https://selenide.org/2026/04/10/selenide-7.16.0/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2026/04/10/selenide-7.16.0/</guid><description>&lt;p&gt;Hello!&lt;/p&gt;
&lt;p&gt;Who&amp;rsquo;s up for a Friday release of &lt;a href="https://github.com/selenide/selenide/milestone/239?closed=1"&gt;Selenide 7.16.0&lt;/a&gt;?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A whole civilization of old-school manual test writers will perish tonight and will never come back.
I don&amp;rsquo;t want that to happen, and I feel sorry for these slow guys, but it probably will. Sad!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2026/04/10/selenide-7.16.0/#selenide-mcp-server"&gt;Selenide MCP server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2026/04/10/selenide-7.16.0/#websockets-in-selenide-proxy"&gt;WebSockets in Selenide proxy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2026/04/10/selenide-7.16.0/#fix-searching-element-by-label"&gt;Searching element by label&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2026/04/10/selenide-7.16.0/#fix-cdp-download-with-multiple-tabs"&gt;CDP download with multiple tabs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2026/04/10/selenide-7.16.0/#handling-alerts-in-firefox"&gt;Alerts in Firefox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2026/04/10/selenide-7.16.0/#form-resubmission-confirmation-dialog-in-firefox"&gt;Disabled &amp;ldquo;form resubmission confirmation dialog&amp;rdquo; in Firefox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2026/04/10/selenide-7.16.0/#ancestor-with-multiple-class-names"&gt;&lt;code&gt;$.ancestor()&lt;/code&gt; with multiple class names&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2026/04/10/selenide-7.16.0/#video-recorder-for-custom-webdriver"&gt;Video recorder with a custom webdriver&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2026/04/10/selenide-7.16.0/#gaps-in-recorded-videos"&gt;Gaps in recorded videos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2026/04/10/selenide-7.16.0/#update-to-selenium-4.43.0"&gt;Upgraded Selenium from 4.41.0 to 4.43.0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;h3 id="selenide-mcp-server"&gt;Selenide MCP server&lt;/h3&gt;
&lt;p&gt;It&amp;rsquo;s happening, folks!&lt;/p&gt;</description></item><item><title>Released Selenide 7.15.0</title><link>https://selenide.org/2026/03/11/selenide-7.15.0/</link><pubDate>Wed, 11 Mar 2026 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2026/03/11/selenide-7.15.0/</guid><description>&lt;p&gt;Good night!&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ve got release &lt;a href="https://github.com/selenide/selenide/milestone/237?closed=1"&gt;Selenide 7.15.0&lt;/a&gt;!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Just minutes ago we launched Operation Java’s Roar.&lt;br&gt;
A massive new release of our Java library.&lt;br&gt;
Nobody builds Java libraries like we do. Nobody.&lt;br&gt;
We fixed the bugs. We destroyed the slow code. Completely obliterated it.&lt;br&gt;
And the performance? Tremendous performance. The best performance you’ve ever seen.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2026/03/11/selenide-7.15.0/#skip-downloading-file-content"&gt;Download file without content&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2026/03/11/selenide-7.15.0/#chrome-driver-in-remote-debugger-mode"&gt;Chrome driver in &amp;ldquo;remote debugger&amp;rdquo; mode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2026/03/11/selenide-7.15.0/#take-screenshot-even-if-cdp-is-disabled"&gt;Screenshots in Chrome with disabled CDP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2026/03/11/selenide-7.15.0/#limit-execution-time-of-all-commands"&gt;Limit execution time of all commands&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2026/03/11/selenide-7.15.0/#fix-video-size-when-browser-size-has-been-changing"&gt;Video size for resizing browser&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2026/03/11/selenide-7.15.0/#or-condition-for-missing-elements"&gt;&amp;ldquo;OR&amp;rdquo; condition for disappeared elements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2026/03/11/selenide-7.15.0/#update-to-selenium-4.41.0"&gt;Update Selenium from 4.40.0 to 4.41.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2026/03/11/selenide-7.15.0/#links"&gt;Links&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;h3 id="skip-downloading-file-content"&gt;Download file without content&lt;/h3&gt;
&lt;p&gt;Selenide has method &lt;code&gt;$.download()&lt;/code&gt; allowing to download a file from a test.&lt;br&gt;
Usually it&amp;rsquo;s useful to verify the name and content of the downloaded file. Or at least its format (pdf/xls/csv/&amp;hellip;).&lt;/p&gt;</description></item><item><title>Released Selenide 7.14.0</title><link>https://selenide.org/2026/01/21/selenide-7.14.0/</link><pubDate>Wed, 21 Jan 2026 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2026/01/21/selenide-7.14.0/</guid><description>&lt;p&gt;Good evening!&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ve got a release &lt;a href="https://github.com/selenide/selenide/milestone/236?closed=1"&gt;Selenide 7.14.0&lt;/a&gt;!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Well, we have a concept of a release.&lt;/p&gt;
&lt;p&gt;I think it’s going to be a very good release for the Selenide also for you.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2026/01/21/selenide-7.14.0/#download-files-with-space"&gt;Fixed downloading files with space in name&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2026/01/21/selenide-7.14.0/#grid-behind-time-download"&gt;Fixed downloading files from grid lagging by 1 second&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2026/01/21/selenide-7.14.0/#fail-fast-for-selenium-grid"&gt;increment timeout for grid&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2026/01/21/selenide-7.14.0/#forbid-removing-selenide-own-proxy-filters"&gt;Forbid removing Selenide own proxy filters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2026/01/21/selenide-7.14.0/#remove-all-request-or-response-filters-separately"&gt;Remove all proxy request filters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2026/01/21/selenide-7.14.0/#mask-type-value"&gt;Mask typed value&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2026/01/21/selenide-7.14.0/#export-video-recorder"&gt;Use Video Recorder without Selenide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2026/01/21/selenide-7.14.0/#shorten-format-of-timeouts"&gt;Compact timeout format in logs and reports&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2026/01/21/selenide-7.14.0/#update-to-selenium-4.40.0"&gt;Upgraded Selenium from 4.39.0 to 4.40.0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;h3 id="download-files-with-space"&gt;Fixed downloading files with space in name&lt;/h3&gt;
&lt;p&gt;Well, that&amp;rsquo;s a classic.&lt;/p&gt;</description></item><item><title>Released Selenide 7.13.0</title><link>https://selenide.org/2025/12/14/selenide-7.13.0/</link><pubDate>Sun, 14 Dec 2025 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2025/12/14/selenide-7.13.0/</guid><description>&lt;p&gt;Hello, coldies!&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ve got a new release &lt;a href="https://github.com/selenide/selenide/milestone/235?closed=1"&gt;Selenide 7.13.0&lt;/a&gt;, let&amp;rsquo;s start the unboxing!&lt;/p&gt;
&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/12/14/selenide-7.13.0/#improve-file-downloading-from-grid"&gt;Sped up downloading files from Selenium Grid&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/12/14/selenide-7.13.0/#fail-fast-if-download-link-not-found"&gt;Download doesn&amp;rsquo;t wait too long if the link is not found&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/12/14/selenide-7.13.0/#mask-credentials-in-remote-url"&gt;Mask credentials in remote URL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/12/14/selenide-7.13.0/#proxy-cleanup-filters"&gt;Added method &lt;code&gt;proxy.cleanupFilters()&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/12/14/selenide-7.13.0/#remove-response-size-watchdog"&gt;Removed warning about response size&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/12/14/selenide-7.13.0/#add-prefix-to-selenide-own-filters"&gt;Added prefix to all Selenide proxy filters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/12/14/selenide-7.13.0/#fix-frame-rate-for-video"&gt;Fixed video rate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/12/14/selenide-7.13.0/#update-to-selenium-4.39.0"&gt;Upgraded Selenium from 4.38.0 to 4.39.0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;h3 id="improve-file-downloading-from-grid"&gt;Sped up downloading files from Selenium Grid&lt;/h3&gt;
&lt;p&gt;Selenide has method &lt;code&gt;$.download()&lt;/code&gt; that downloads a file in the browser, and returns this file.
It&amp;rsquo;s useful for testing all kinds of reports, Excel and PDF files etc.&lt;/p&gt;</description></item><item><title>Released Selenide 7.12.0</title><link>https://selenide.org/2025/10/29/selenide-7.12.0/</link><pubDate>Wed, 29 Oct 2025 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2025/10/29/selenide-7.12.0/</guid><description>&lt;p&gt;Stay a while, oh moment!&lt;/p&gt;
&lt;p&gt;The second release of &lt;a href="https://github.com/selenide/selenide/milestone/229?closed=1"&gt;Selenide 7.12.0&lt;/a&gt; has been done in October.
Don&amp;rsquo;t miss the update!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I can’t put into words the whole range of emotions…&lt;/p&gt;
&lt;p&gt;When you spend every month hacking away at something, releasing it — and then suddenly see that people are
actually reading the release notes and upgrading — isn’t that the best reward?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/10/29/selenide-7.12.0/#screenshots-with-devtools"&gt;Screenshots with DevTools/BiDi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/10/29/selenide-7.12.0/#by-label"&gt;New locator &lt;code&gt;byLabel&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/10/29/selenide-7.12.0/#new-locators"&gt;New locators &lt;code&gt;byPlaceholder&lt;/code&gt;, &lt;code&gt;byTitle&lt;/code&gt;, &lt;code&gt;byAltText&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/10/29/selenide-7.12.0/#by-test-id"&gt;New locator &lt;code&gt;byTestId&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/10/29/selenide-7.12.0/#mobile-emulation"&gt;Mobile emulation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/10/29/selenide-7.12.0/#browser-logs-with-bidi"&gt;Browser logs with DevTools/BiDi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/10/29/selenide-7.12.0/#shadow-host-as-context"&gt;Search right in shadow host &lt;code&gt;byShadowCss&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/10/29/selenide-7.12.0/#unhighlight"&gt;New method &lt;code&gt;$.unhighlight()&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/10/29/selenide-7.12.0/#update-to-selenium-4.38.0"&gt;Update Selenium from 4.36.0 to 4.38.0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;h3 id="screenshots-with-devtools"&gt;Screenshots with DevTools/BiDi&lt;/h3&gt;
&lt;p&gt;Selenide now uses a different method for taking screenshots than the standard webdriver method:
either using DevTools (in Chromium) or BiDi (in Firefox).&lt;/p&gt;</description></item><item><title>Released Selenide 7.11.1</title><link>https://selenide.org/2025/10/04/selenide-7.11.1/</link><pubDate>Sat, 04 Oct 2025 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2025/10/04/selenide-7.11.1/</guid><description>&lt;p&gt;Good morning!&lt;/p&gt;
&lt;p&gt;Great news:
we released &lt;a href="https://github.com/selenide/selenide/milestone/230?closed=1"&gt;Selenide 7.11.1&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You’re five weeks working on a release that should have taken a week,
Are you a paper tiger?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Yes, the changes are more internal to technical. But they still can break something in your tests. ;)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/10/04/selenide-7.11.1/#disable-smooth-scrolling-by-default"&gt;Disable smooth scrolling&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/10/04/selenide-7.11.1/#fix-augmenter-usages"&gt;Fixed usage of &lt;code&gt;Augmenter&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/10/04/selenide-7.11.1/#custom-screenshot-laboratory"&gt;Refactored&lt;code&gt;ScreenShotLaboratory&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/10/04/selenide-7.11.1/#remove-workaround-for-host-identifier"&gt;Removed hack for &lt;code&gt;HostIdentifier&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/10/04/selenide-7.11.1/#publish-jars-without-signing"&gt;Publish jars without signing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/10/04/selenide-7.11.1/#update-to-selenium-4.36.0"&gt;Updated Selenium from 4.35.0 to 4.36.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/10/04/selenide-7.11.1/#update-to-junit-6.0.0"&gt;Updated JUnit from 5.x to 6.0.0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;h3 id="disable-smooth-scrolling-by-default"&gt;Disable smooth scrolling&lt;/h3&gt;
&lt;p&gt;Sometimes tests may &lt;a href="https://www.youtube.com/watch?v=18J2_4a4Cl4"&gt;flake&lt;/a&gt; when they try to click a web element which is moving exactly at this moment.
Sometimes it&amp;rsquo;s moving because of &amp;ldquo;smooth scrolling&amp;rdquo; used in web design.&lt;/p&gt;</description></item><item><title>Released Selenide 7.10.0</title><link>https://selenide.org/2025/08/20/selenide-7.10.0/</link><pubDate>Wed, 20 Aug 2025 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2025/08/20/selenide-7.10.0/</guid><description>&lt;p&gt;Head õhtut!&lt;/p&gt;
&lt;p&gt;On August 20, Estonia celebrates its second birthday – Independence Restoration Day.&lt;/p&gt;
&lt;p&gt;In honor of the holiday we made a release &lt;a href="https://github.com/selenide/selenide/milestone/227?closed=1"&gt;Selenide 7.10.0&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Now it&amp;rsquo;s our video recorder&amp;rsquo;s second birthday too! (it&amp;rsquo;s been heavily redesigned)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/08/20/selenide-7.10.0/#speed-up-video-recorder"&gt;Speed up the video recorder&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/08/20/selenide-7.10.0/#take-screenshots-using-bidi-or-devtools"&gt;Screenshots for video recorder via BiDi or DevTools&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/08/20/selenide-7.10.0/#scroll-with-options"&gt;Compile-safe scrolling &lt;code&gt;$.scrollIntoView(options)&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/08/20/selenide-7.10.0/#static-methods-for-containers-initialization"&gt;Static methods for creating containers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/08/20/selenide-7.10.0/#deep-shadow-annotation"&gt;&lt;code&gt;@DeepShadow&lt;/code&gt; annotation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/08/20/selenide-7.10.0/#validate-increment-timeout"&gt;Validation of &lt;code&gt;incrementTimeout&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/08/20/selenide-7.10.0/#update-to-selenium-4.35.0"&gt;Updated Selenium from 4.34.0 to 4.35.0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;h3 id="speed-up-video-recorder"&gt;Speed up the video recorder&lt;/h3&gt;
&lt;p&gt;In the first versions of the video recorder, we used the &lt;code&gt;org.bytedeco:javacv&lt;/code&gt; library to merge all captured screenshots into a video file.&lt;/p&gt;</description></item><item><title>Released Selenide 7.9.4</title><link>https://selenide.org/2025/07/05/selenide-7.9.4/</link><pubDate>Sat, 05 Jul 2025 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2025/07/05/selenide-7.9.4/</guid><description>&lt;p&gt;Hey there!&lt;/p&gt;
&lt;p&gt;I get it — it&amp;rsquo;s July, it&amp;rsquo;s hot, work&amp;rsquo;s the last thing on your mind. But you do need to update to &lt;a href="https://github.com/selenide/selenide/milestone/226?closed=1"&gt;Selenide 7.9.4&lt;/a&gt;!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/07/05/selenide-7.9.4/#update-to-selenium-4.34.0"&gt;Updated Selenium from 4.33.0 to 4.34.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/07/05/selenide-7.9.4/#fix-colors-in-video-recorder-in-firefox"&gt;Fixed colors in video recorder in Firefox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/07/05/selenide-7.9.4/#change-return-type-to-selenide-appium-element"&gt;Changed type to &lt;code&gt;SelenideAppiumElement&lt;/code&gt; in mobile methods&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/07/05/selenide-7.9.4/#replace-context-aware"&gt;Replaced &lt;code&gt;ContextAware&lt;/code&gt; by &lt;code&gt;SupportsContextSwitching&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/07/05/selenide-7.9.4/#news"&gt;News&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;h3 id="update-to-selenium-4.34.0"&gt;Updated Selenium from 4.33.0 to 4.34.0&lt;/h3&gt;
&lt;p&gt;And updated CDP from v137 to v138.&lt;br&gt;
Also, updated Appium from 9.4.0 to 9.5.0&lt;/p&gt;</description></item><item><title>Released Selenide 7.9.3</title><link>https://selenide.org/2025/05/27/selenide-7.9.3/</link><pubDate>Tue, 27 May 2025 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2025/05/27/selenide-7.9.3/</guid><description>&lt;p&gt;Hello!&lt;/p&gt;
&lt;p&gt;Before the summer begins, it&amp;rsquo;s a good moment to upgrade to &lt;a href="https://github.com/selenide/selenide/milestone/225?closed=1"&gt;Selenide 7.9.3&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/05/27/selenide-7.9.3/#update-to-selenium-4.33.0"&gt;Updated Selenium from 4.32.0 to 4.33.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/05/27/selenide-7.9.3/#click-holding-left-keys"&gt;Click holding left keys&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/05/27/selenide-7.9.3/#fix-bug-with-focus-in-set-value"&gt;Bug with focus in &lt;code&gt;$.setValue&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/05/27/selenide-7.9.3/#fix-page-object-initialization-without-webdriver"&gt;Fixed lazy initialisation of page objects&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/05/27/selenide-7.9.3/#fix-condition-texts-in-any-order"&gt;Check &amp;ldquo;texts in any order&amp;rdquo; in &lt;code&gt;FULL_TEXT&lt;/code&gt; mode&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;h3 id="update-to-selenium-4.33.0"&gt;Updated Selenium from 4.32.0 to 4.33.0&lt;/h3&gt;
&lt;p&gt;And bumped CDP version from v136 to v137. &lt;em&gt;It&amp;rsquo;s crazy how cool this is!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;See &lt;a href="https://github.com/selenide/selenide/pull/3034"&gt;PR 3034&lt;/a&gt;&lt;/p&gt;
&lt;br&gt;
&lt;h3 id="click-holding-left-keys"&gt;Click holding left keys&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://selenide.org/2025/04/19/selenide-7.9.0/#click-holding-keys"&gt;Recently&lt;/a&gt; we implemented JS click while holding keys &lt;code&gt;ALT&lt;/code&gt;, &lt;code&gt;CTRL&lt;/code&gt;, &lt;code&gt;SHIFT&lt;/code&gt; or &lt;code&gt;META&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Released Selenide 7.9.2</title><link>https://selenide.org/2025/05/08/selenide-7.9.2/</link><pubDate>Thu, 08 May 2025 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2025/05/08/selenide-7.9.2/</guid><description>&lt;p&gt;Hiiiee!&lt;/p&gt;
&lt;p&gt;White smoke has emerged, signalling a new release has been made: &lt;a href="https://github.com/selenide/selenide/milestone/224?closed=1"&gt;Selenide 7.9.2&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/05/08/selenide-7.9.2/#fix-color-on-video"&gt;Fixed colors on video&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/05/08/selenide-7.9.2/#optimize-video-recorder"&gt;Optimized video recorder&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/05/08/selenide-7.9.2/#attach-video-recordings"&gt;Attach video files&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/05/08/selenide-7.9.2/#update-to-selenium-4.32.0"&gt;Updated to Selenium 4.32.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/05/08/selenide-7.9.2/#fix-class-cast-in-selenide-appium"&gt;Fixed ClassCastException&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/05/08/selenide-7.9.2/#improve-loops-performance"&gt;Slightly improved loops performance&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;h3 id="fix-color-on-video"&gt;Fixed colors on video&lt;/h3&gt;
&lt;p&gt;In November, we added &lt;a href="https://selenide.org/2024/11/24/selenide-7.6.0/#video-recorder"&gt;video recorder&lt;/a&gt; to Selenide.
This is an insanely useful feature for &lt;a href="https://www.youtube.com/watch?v=-TvVCxmb9ss&amp;amp;ab_channel=EpicHey%21Conference"&gt;debugging tests&lt;/a&gt;,
but turns out the generated videos had some color defects.&lt;/p&gt;
&lt;h4 id="before"&gt;Before&lt;/h4&gt;
&lt;p&gt;On the left, there is the original web page. On the right - how it looked in videos:&lt;/p&gt;</description></item><item><title>Released Selenide 7.9.0</title><link>https://selenide.org/2025/04/19/selenide-7.9.0/</link><pubDate>Sat, 19 Apr 2025 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2025/04/19/selenide-7.9.0/</guid><description>&lt;p&gt;Hello, quadrobers!&lt;/p&gt;
&lt;p&gt;We have released &lt;a href="https://github.com/selenide/selenide/milestone/222?closed=1"&gt;Selenide 7.9.0&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/04/19/selenide-7.9.0/#screenshots-as-attachment"&gt;Attach screenshots to Jenkins and GitLab&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/04/19/selenide-7.9.0/#click-holding-keys"&gt;Click holding keys&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/04/19/selenide-7.9.0/#update-to-selenium-4.31.0"&gt;Upgrade to Selenium 4.31.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/04/19/selenide-7.9.0/#check-for-empty-expected-value"&gt;Check for empty expected value&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You know, tariffs set to rise to at least 104% on features import in Selenide&amp;hellip; ¯¯_(ツ)_/¯¯&lt;/p&gt;
&lt;br&gt;
&lt;h3 id="screenshots-as-attachment"&gt;Attach screenshots to Jenkins and GitLab&lt;/h3&gt;
&lt;p&gt;When you run tests, Selenide automatically &lt;a href="https://selenide.org/documentation/screenshots.html"&gt;takes screenshots&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The path to the screenshot is added to the error message. This is very convenient when running locally, but when
the tests are run on Gitlab, GitHub Actions or Jenkins, you still need to somehow save these files (archive, download artifacts, etc.).&lt;/p&gt;</description></item><item><title>Released Selenide 7.8.0</title><link>https://selenide.org/2025/04/02/selenide-7.8.0/</link><pubDate>Wed, 02 Apr 2025 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2025/04/02/selenide-7.8.0/</guid><description>&lt;p&gt;Mi amore, mi amore!&lt;/p&gt;
&lt;p&gt;This evening, my &lt;em&gt;outie&lt;/em&gt; released &lt;a href="https://github.com/selenide/selenide/milestone/220?closed=1"&gt;Selenide 7.8.0&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I am wondering if my &lt;em&gt;innie&lt;/em&gt; will read this text tomorrow morning and get familiar with the new Selenide features?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/04/02/selenide-7.8.0/#new-appium-functions"&gt;New functions for Appium&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/04/02/selenide-7.8.0/#remove-proxy-listeners"&gt;Remove proxy filters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/04/02/selenide-7.8.0/#shadow-host-in-page-objects"&gt;Annotation &lt;code&gt;@ShadowHost&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/04/02/selenide-7.8.0/#improve-combined-attributes-in-reports"&gt;Combined attributes in reports&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/04/02/selenide-7.8.0/#upgrade-to-selenium-4.30.0"&gt;Upgraded to Selenium 4.30.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/04/02/selenide-7.8.0/#news"&gt;News&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;h3 id="new-appium-functions"&gt;New functions for Appium&lt;/h3&gt;
&lt;p&gt;For Appium users, we added three new functions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;activate an app,&lt;/li&gt;
&lt;li&gt;terminate the app,&lt;/li&gt;
&lt;li&gt;relaunch the app.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can find all these methods in class &lt;code&gt;SelenideAppium&lt;/code&gt;:&lt;/p&gt;</description></item><item><title>Released Selenide 7.7.0</title><link>https://selenide.org/2025/01/07/selenide-7.7.0/</link><pubDate>Tue, 07 Jan 2025 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2025/01/07/selenide-7.7.0/</guid><description>&lt;p&gt;Happy New Year everyone!&lt;/p&gt;
&lt;p&gt;We started the year with a release &lt;a href="https://github.com/selenide/selenide/milestone/216?closed=1"&gt;Selenide 7.7.0&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/01/07/selenide-7.7.0/#moon"&gt;Moon support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/01/07/selenide-7.7.0/#scroll-with-parameters"&gt;Method &lt;code&gt;$.scroll()&lt;/code&gt; with parameters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/01/07/selenide-7.7.0/#fix-selenide-on-java-22"&gt;Fixed Selenide on Java 22&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/01/07/selenide-7.7.0/#update-proxy-mitm-certificate"&gt;MITM certificate for Selenide proxy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;h3 id="moon"&gt;Added support for Moon&lt;/h3&gt;
&lt;p&gt;Once upon a time, the guys from Aerokube created Selenoid - it was like Selenium Grid on steroids.
Selenoid could run browsers in Docker, shot videos and quickly became popular. Four years ago, we added support for Selenoid in Selenide.&lt;/p&gt;</description></item><item><title>Year summary</title><link>https://selenide.org/2025/01/03/year-summary/</link><pubDate>Fri, 03 Jan 2025 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2025/01/03/year-summary/</guid><description>&lt;p&gt;Happy New Year!&lt;/p&gt;
&lt;p&gt;Damn 2024 is finally over, time to take stock of the year.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/01/03/year-summary/#milestones"&gt;Milestones&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/01/03/year-summary/#committers"&gt;Elves&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/01/03/year-summary/#playwrightium"&gt;Wizards&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/01/03/year-summary/#videos"&gt;Palantirs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/01/03/year-summary/#companies"&gt;Tribes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2025/01/03/year-summary/#statistics"&gt;People&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="milestones"&gt;Milestones&lt;/h2&gt;
&lt;p&gt;This year we have released 18 versions (from 7.0.5 to 7.6.1) and implemented several important features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/11/24/selenide-7.6.0/#video-recorder"&gt;Video recorder&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/02/27/selenide-7.2.0/#download-files-to-folder-in-selenium-grid"&gt;Downloading files from Selenium Grid&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/02/07/selenide-7.1.0/#download-files-with-cdp"&gt;New way to download files via CDP&lt;/a&gt; - and also &lt;a href="https://selenide.org/2024/02/27/selenide-7.2.0/#download-files-remotely-with-cdp"&gt;for Grid and Selenoid&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/09/15/selenide-7.5.0/#new-configuration-for-every-browser"&gt;Open browser with a new configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Finally, &lt;a href="https://selenide.org/2024/02/07/selenide-7.1.0/#if-with-timeout"&gt;abused Selenide ¯¯&lt;em&gt;(ツ)&lt;/em&gt;/¯¯&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;h2 id="committers"&gt;Elves&lt;/h2&gt;
&lt;p&gt;These guys have been working tirelessly all year and putting presents under the tree.
This job is extremely important for the project, despite the fact that their names are often not even visible in
press releases, because many of these changes are internal or too technical. Sometimes they don&amp;rsquo;t even get merged at all.&lt;/p&gt;</description></item><item><title>Released Selenide 7.6.0</title><link>https://selenide.org/2024/11/24/selenide-7.6.0/</link><pubDate>Sun, 24 Nov 2024 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2024/11/24/selenide-7.6.0/</guid><description>&lt;p&gt;Good evening!&lt;br&gt;
We released &lt;a href="https://github.com/selenide/selenide/milestone/214?closed=1"&gt;Selenide 7.6.0&lt;/a&gt; with something tasty and interesting.&lt;br&gt;
Yo-yo, rush to update!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Videos are a serious thing.
If there are videos, then they reflect something.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;What&amp;rsquo;s new:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/11/24/selenide-7.6.0/#video-recorder"&gt;Added video recorder&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/11/24/selenide-7.6.0/#add-because-for-webdriver-conditions"&gt;&lt;code&gt;because&lt;/code&gt; for webdriver conditions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/11/24/selenide-7.6.0/#scroll-into-center"&gt;Method &lt;code&gt;$.scrollIntoCenter()&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/11/24/selenide-7.6.0/#support-special-space-characters"&gt;Special space characters support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/11/24/selenide-7.6.0/#fix-in-new-browser-with-custom-config"&gt;Fixed &lt;code&gt;inNewBrowser&lt;/code&gt; with custom configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/11/24/selenide-7.6.0/#fix-appium-page-factory"&gt;Fixed appium page factory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/11/24/selenide-7.6.0/#less-selenide-logs"&gt;Reduced the number of Selenide logs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/11/24/selenide-7.6.0/#fix-screenshot-behaviour"&gt;Fixed &lt;code&gt;Selenide.screenshot(filename)&lt;/code&gt; behaviour&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/11/24/selenide-7.6.0/#jspecify"&gt;JSR305 -&amp;gt; JSpecify&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/11/24/selenide-7.6.0/#simplify-custom-commands"&gt;Simplified custom commands&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/11/24/selenide-7.6.0/#update-dependencies"&gt;Updated dependencies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/11/24/selenide-7.6.0/#news"&gt;News&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/11/24/selenide-7.6.0/#statistics"&gt;Statistics&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;h3 id="video-recorder"&gt;Added video recorder&lt;/h3&gt;
&lt;p&gt;Finally!&lt;/p&gt;</description></item><item><title>Released Selenide 7.5.0</title><link>https://selenide.org/2024/09/15/selenide-7.5.0/</link><pubDate>Sun, 15 Sep 2024 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2024/09/15/selenide-7.5.0/</guid><description>&lt;p&gt;Long time no see, cats!&lt;/p&gt;
&lt;p&gt;I wrote the last release notes in April. Since then, we have made a few releases, the most significant was &lt;a href="https://github.com/selenide/selenide/milestone/208?closed=1"&gt;7.4.0&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;But now it&amp;rsquo;s time to upgrade to &lt;a href="https://github.com/selenide/selenide/milestone/212?closed=1"&gt;Selenide 7.5.0&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/09/15/selenide-7.5.0/#new-configuration-for-every-browser"&gt;New configuration for every browser&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/09/15/selenide-7.5.0/#raise-bubbleable-events-from-selects"&gt;Fixed events in selects&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/09/15/selenide-7.5.0/#builder-methods-for-download-options"&gt;Shorter API for downloading files&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/09/15/selenide-7.5.0/#do-not-close-windows-when-downloading-file"&gt;Don&amp;rsquo;t close windows when downloading files&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/09/15/selenide-7.5.0/#do-not-catch-all-errors"&gt;Don&amp;rsquo;t catch all Errors anymore&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/09/15/selenide-7.5.0/#generate-error-details-during-error-construction"&gt;Fixed custom error formatters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/09/15/selenide-7.5.0/#update-dependencies"&gt;Updated dependencies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/09/15/selenide-7.5.0/#news"&gt;News&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/09/15/selenide-7.5.0/#statistics"&gt;Statistics&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;h3 id="new-configuration-for-every-browser"&gt;New configuration for every browser&lt;/h3&gt;
&lt;p&gt;Selenide has one nuance that might not be obvious to newcomers: all settings in &lt;code&gt;Configuration&lt;/code&gt; class are &lt;em&gt;static&lt;/em&gt;.
When you change any setting in one test, it affects other tests as well. It may be especially important when running tests in parallel.&lt;/p&gt;</description></item><item><title>Released Selenide 7.3.1</title><link>https://selenide.org/2024/04/28/selenide-7.3.1/</link><pubDate>Sun, 28 Apr 2024 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2024/04/28/selenide-7.3.1/</guid><description>&lt;p&gt;Good morning!&lt;/p&gt;
&lt;p&gt;We released &lt;a href="https://github.com/selenide/selenide/milestone/205?closed=1"&gt;Selenide 7.3.1&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s a tiny release, so it will be easy to upgrade. Let&amp;rsquo;s start the unboxing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/04/28/selenide-7.3.1/#mock-specific-content-type"&gt;Mock response with specific content type&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/04/28/selenide-7.3.1/#fix-clear-in-appium"&gt;Fixed method &lt;code&gt;$.clear()&lt;/code&gt; in mobile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/04/28/selenide-7.3.1/#fix-error-message-for-invalid-link"&gt;Fixed error message when clicking an invalid link&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/04/28/selenide-7.3.1/#disable-warning-about-stolen-password"&gt;Disabled Chrome warning about stolen password&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/04/28/selenide-7.3.1/#fix-cdp-download-for-custom-webdrivers"&gt;Fix CDP downloading for custom webdrivers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/04/28/selenide-7.3.1/#deprecate-setting-hold-browser-open"&gt;Deprecated setting &lt;code&gt;holdBrowserOpen&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/04/28/selenide-7.3.1/#upgrade-to-selenium-4.20.0"&gt;Upgraded Selenium from 4.19.1 to 4.20.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/04/28/selenide-7.3.1/#statistics"&gt;Statistics&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;h3 id="mock-specific-content-type"&gt;Mock response with specific content type&lt;/h3&gt;
&lt;p&gt;As you know, Selenide allows to &lt;a href="https://selenide.org/2022/10/07/selenide-6.9.0/#proxy-mock-response"&gt;mock server response&lt;/a&gt; using its built-in proxy server:&lt;/p&gt;</description></item><item><title>Released Selenide 7.2.0</title><link>https://selenide.org/2024/02/27/selenide-7.2.0/</link><pubDate>Tue, 27 Feb 2024 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2024/02/27/selenide-7.2.0/</guid><description>&lt;p&gt;Damn February.&lt;/p&gt;
&lt;p&gt;To lift your spirits a bit, try to upgrade to &lt;a href="https://github.com/selenide/selenide/milestone/201?closed=1"&gt;Selenide 7.2.0&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/02/27/selenide-7.2.0/#download-files-to-folder-in-selenium-grid"&gt;Download files from Selenium Grid&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/02/27/selenide-7.2.0/#download-files-remotely-with-cdp"&gt;Download files remotely using CDP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/02/27/selenide-7.2.0/#mobile-elements-collections"&gt;Collections for mobile tests&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/02/27/selenide-7.2.0/#disable-chrome-warning-about-stolen-passwords"&gt;Disabled chrome warning about stolen password&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/02/27/selenide-7.2.0/#improve-error-message-for-download-without-href"&gt;Error message for element without href&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/02/27/selenide-7.2.0/#upgraded-to-selenium-4.18.1"&gt;Updated Selenium from 4.17.0 to 4.18.1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;h3 id="download-files-to-folder-in-selenium-grid"&gt;Download files from Selenium Grid&lt;/h3&gt;
&lt;p&gt;Finally!&lt;br&gt;
Now you can download using &lt;code&gt;FOLDER&lt;/code&gt; method from Selenium Grid.&lt;br&gt;
Until now, &lt;code&gt;FOLDER&lt;/code&gt; only worked for local browsers and Selenoid.&lt;/p&gt;</description></item><item><title>Released Selenide 7.1.0</title><link>https://selenide.org/2024/02/07/selenide-7.1.0/</link><pubDate>Wed, 07 Feb 2024 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2024/02/07/selenide-7.1.0/</guid><description>&lt;p&gt;Good evening!
Happy New Year, happy new hopes!&lt;/p&gt;
&lt;p&gt;Today we have a fresh shiny &lt;a href="https://github.com/selenide/selenide/milestone/199?closed=1"&gt;Selenide 7.1.0&lt;/a&gt; one on the menu:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/02/07/selenide-7.1.0/#download-files-with-cdp"&gt;Download files with CDP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/02/07/selenide-7.1.0/#animated-condition"&gt;Condition &lt;code&gt;animated&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/02/07/selenide-7.1.0/#if-with-timeout"&gt;IF with timeout ¯¯_(ツ)_/¯¯&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/02/07/selenide-7.1.0/#force-click"&gt;Click disabled elements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/02/07/selenide-7.1.0/#method-unfocus"&gt;New method &lt;code&gt;$.unfocus()&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/02/07/selenide-7.1.0/#avoid-page-load-timeout-in-mobile"&gt;Fixed page load timeout in mobile tests&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/02/07/selenide-7.1.0/#can-add-same-proxy-filter-many-times"&gt;Add same proxy filter many times&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/02/07/selenide-7.1.0/#update-dependencies"&gt;Updated dependencies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2024/02/07/selenide-7.1.0/#statistics"&gt;Statistics&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;h3 id="download-files-with-cdp"&gt;Download files with CDP&lt;/h3&gt;
&lt;p&gt;Less than three years have passed since CDP was introduced into Selenium, and we have already downloaded files using it!
As you know, there are several ways to download files in Selenide: &lt;code&gt;HTTPGET&lt;/code&gt;, &lt;code&gt;FOLDER&lt;/code&gt;, &lt;code&gt;PROXY&lt;/code&gt;.
Now &lt;code&gt;CDP&lt;/code&gt; has been added to them:&lt;/p&gt;</description></item><item><title>Released Selenide 7.0.1</title><link>https://selenide.org/2023/10/26/selenide-7.0.1/</link><pubDate>Thu, 26 Oct 2023 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2023/10/26/selenide-7.0.1/</guid><description>&lt;p&gt;Yesterday we released &lt;a href="https://selenide.org/2023/10/25/selenide-7.0.0/"&gt;Selenide 7.0.0&lt;/a&gt;. I expected complains about Java 17, but&amp;hellip;&lt;/p&gt;
&lt;p&gt;no. Nobody complained about Java 17. And that&amp;rsquo;s great!&lt;br&gt;
But people asked to restore loops over collections.&lt;/p&gt;
&lt;p&gt;Well, in today update &lt;a href="https://github.com/selenide/selenide/milestone/194?closed=1"&gt;Selenide 7.0.1&lt;/a&gt; we restored a couple of things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2023/10/26/selenide-7.0.1/#restore-collection-loop"&gt;Restore loops over collections&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2023/10/26/selenide-7.0.1/#restore-collection-is-empty"&gt;Restore method &lt;code&gt;isEmpty()&lt;/code&gt; for collections&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2023/10/26/selenide-7.0.1/#restore-self-in-containers"&gt;Return field &lt;code&gt;self&lt;/code&gt; in containers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2023/10/26/selenide-7.0.1/#rename-collection-condition"&gt;Renamed &lt;code&gt;CollectionCondition&lt;/code&gt; to &lt;code&gt;WebElementsCondition&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2023/10/26/selenide-7.0.1/#upgrade-to-selenium-4.15.0"&gt;UPD 7.0.2: Upgraded to Selenium 4.15.0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;h3 id="restore-collection-loop"&gt;Restore loops over collections&lt;/h3&gt;
&lt;p&gt;Now you can use &lt;code&gt;for&lt;/code&gt; loop again:&lt;/p&gt;</description></item><item><title>Released Selenide 7.0.0</title><link>https://selenide.org/2023/10/25/selenide-7.0.0/</link><pubDate>Wed, 25 Oct 2023 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2023/10/25/selenide-7.0.0/</guid><description>&lt;p&gt;Happy birthday!&lt;/p&gt;
&lt;p&gt;Today is October 25.
Today, 12 years ago the first commit in the Selenide project was created.&lt;/p&gt;
&lt;p&gt;For the holiday, we released a major release &lt;a href="https://github.com/selenide/selenide/milestone/191?closed=1"&gt;Selenide 7.0.0&lt;/a&gt;
with the update immediately to Java 17.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2023/10/25/selenide-7.0.0/#java17"&gt;Updated to Java 17&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2023/10/25/selenide-7.0.0/#update-dependencies"&gt;Updated dependencies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2023/10/25/selenide-7.0.0/#fix-deadlock-in-static-initialization"&gt;Static initialization deadlock&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2023/10/25/selenide-7.0.0/#report-actual-value-at-the-moment-of-check"&gt;Actual value at the moment of check&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2023/10/25/selenide-7.0.0/#remove-deprecated-condition-methods"&gt;Removed deprecated methods in &lt;code&gt;Condition&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2023/10/25/selenide-7.0.0/#remove-deprecated-methods-from-collection-conditions"&gt;Removed deprecated methods in &lt;code&gt;CollectionCondition&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2023/10/25/selenide-7.0.0/#remove-deprecated-methods-from-elements-collection"&gt;Removed deprecated methods in &lt;code&gt;ElementsCollection&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2023/10/25/selenide-7.0.0/#replace-elements-container-by-container"&gt;Replaced deprecated &lt;code&gt;ElementsContainer&lt;/code&gt; by &lt;code&gt;Container&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2023/10/25/selenide-7.0.0/#replace-file-not-found-exception"&gt;Replaced &lt;code&gt;FileNotFoundException&lt;/code&gt; by &lt;code&gt;FileNotDownloadedError&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2023/10/25/selenide-7.0.0/#rename-exceptions-to-errors"&gt;Renamed &lt;code&gt;*Exception&lt;/code&gt; to &lt;code&gt;*Error&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2023/10/25/selenide-7.0.0/#remove-deprecated-listener"&gt;Removed support for deprecated &lt;code&gt;WebDriverEventListener&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2023/10/25/selenide-7.0.0/#remove-deprecated-drag-and-drop-methods"&gt;Removed deprecated Drag&amp;rsquo;n&amp;rsquo;drop methods&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2023/10/25/selenide-7.0.0/#remove-deprecated-get-selected-value-methods"&gt;Removed deprecated methods &lt;code&gt;$.getSelectedValue()&lt;/code&gt; and &lt;code&gt;$.getSelectedText()&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2023/10/25/selenide-7.0.0/#remove-deprecated-testng-annotations"&gt;Removed deprecated TestNG annotations &lt;code&gt;@Report&lt;/code&gt; and &lt;code&gt;@GlobalTextReport&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2023/10/25/selenide-7.0.0/#remove-other-deprecated-methods"&gt;Other cleanup&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;h3 id="java17"&gt;Updated to Java 17&lt;/h3&gt;
&lt;p&gt;Wow!&lt;br&gt;
This day came!&lt;/p&gt;</description></item><item><title>Released Selenide 6.19.1</title><link>https://selenide.org/2023/10/18/selenide-6.19.1/</link><pubDate>Wed, 18 Oct 2023 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2023/10/18/selenide-6.19.1/</guid><description>&lt;p&gt;Good morning!&lt;/p&gt;
&lt;p&gt;The world is frozen in anticipation, big changes are coming!
Selenide 7.0.0 will be coming soon with an update to Java 11.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The era of Java8 lambda cuckolds is passing&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;At last, we released &lt;strong&gt;the last version&lt;/strong&gt; that can run on Java 8:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/selenide/selenide/milestone/193?closed=1"&gt;Selenide 6.19.1&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Mostly there are dependency updates, primarily Appium 8.6.0:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;bump Appium from 8.5.1 to 8.6.0 &lt;a href="https://github.com/selenide/selenide/pull/2494"&gt;(#2494)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Bump BrowserUpProxy &lt;a href="https://github.com/selenide/selenide/pull/2510"&gt;(#2510)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Bump Netty from 4.1.98.Final to 4.1.100.Final &lt;a href="https://github.com/selenide/selenide/pull/2484"&gt;(#2484)&lt;/a&gt; &lt;a href="https://github.com/selenide/selenide/pull/2498"&gt;(#2498)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Bump LittleProxy from 2.0.21 to 2.0.22 &lt;a href="https://github.com/selenide/selenide/pull/2491"&gt;(#2491)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Bump Guava from 32.1.2-jre to 32.1.3-jre &lt;a href="https://github.com/selenide/selenide/pull/2499"&gt;(#2499)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Bump Jackson from 2.15.2 to 2.15.3 &lt;a href="https://github.com/selenide/selenide/pull/2502"&gt;(#2502)&lt;/a&gt; &lt;a href="https://github.com/selenide/selenide/pull/2503"&gt;(#2503)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Bump commons-io from 2.13.0 to 2.14.0 &lt;a href="https://github.com/selenide/selenide/pull/2486"&gt;(#2486)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;p&gt;&lt;a href="http://asolntsev.github.io/"&gt;Andrei Solntsev&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Released Selenide 6.19.0</title><link>https://selenide.org/2023/09/28/selenide-6.19.0/</link><pubDate>Thu, 28 Sep 2023 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2023/09/28/selenide-6.19.0/</guid><description>&lt;p&gt;Good Sunday!&lt;br&gt;
At the end of September, we released &lt;a href="https://github.com/selenide/selenide/milestone/192?closed=1"&gt;Selenide 6.19.0&lt;/a&gt;.&lt;/p&gt;
&lt;div class="blogpost-menu"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#add-highlight-method"&gt;New method &lt;code&gt;$.highlight()&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#strip-invisible-spaces-in-collections"&gt;Strip invisible spaces in collections&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#upgrade-to-selenium-4.13.0"&gt;Upgrade to Selenium 4.13.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#remove-hub-url-check"&gt;Removed strict check for "/wd/hub"&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#replace-elements-container-by-container"&gt;Replaced &lt;code&gt;ElementsContainer&lt;/code&gt; by &lt;code&gt;Container&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#tap-double-tap"&gt;Methods &lt;code&gt;$.tap()&lt;/code&gt;, &lt;code&gt;$.doubleTap()&lt;/code&gt; for mobile apps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#add-selector-by-class-and-index"&gt;Selector by class+index for mobile apps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#news"&gt;News&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
 &lt;br&gt;
&lt;h3 id="add-highlight-method"&gt;New method &lt;code&gt;$.highlight()&lt;/code&gt; for highlighting a web element&lt;/h3&gt;
&lt;p&gt;I feel like we’re opening another Pandora’s box, but what can we do?&lt;/p&gt;
&lt;p&gt;Well, we&amp;rsquo;ve added a method to highlight an element.&lt;/p&gt;</description></item><item><title>Released Selenide 6.18.0</title><link>https://selenide.org/2023/09/06/selenide-6.18.0/</link><pubDate>Wed, 06 Sep 2023 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2023/09/06/selenide-6.18.0/</guid><description>&lt;p&gt;Good night!&lt;/p&gt;
&lt;p&gt;Good news.&lt;br&gt;
We released &lt;a href="https://github.com/selenide/selenide/milestone/190?closed=1"&gt;Selenide 6.18.0&lt;/a&gt;.&lt;/p&gt;
&lt;div class="blogpost-menu"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#show-actual-texts-in-collections"&gt;Show actual texts in collections&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#update-to-selenium-4.12.1"&gt;Upgrade to Selenium 4.12.1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#restore-basic-auth-via-cdp"&gt;Restore BasicAuth via DevTools&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#add-method-get-options"&gt;Added method &lt;code&gt;$$.getOptions()&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#get-focused-element-lazy-loaded"&gt;Method &lt;code&gt;getFocusedElement()&lt;/code&gt; made lazy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#support-appium-elements-in-page-objects"&gt;Fields &lt;code&gt;SelenideAppiumElement&lt;/code&gt; in page objects&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#exact-scroll-in-appium"&gt;Precise scrolling in mobile apps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#no-elements-container-for-page-object"&gt;Don't inherit page objects from &lt;code&gt;ElementsContainer&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#update-dependencies"&gt;Updated dependencies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#statistics"&gt;Statistics&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
 &lt;br&gt;
&lt;h3 id="show-actual-texts-in-collections"&gt;Show actual texts in collections&lt;/h3&gt;
&lt;p&gt;In Selenide 6.16.0, we &lt;a href="https://selenide.org/2023/07/02/selenide-6.16.0/#speedup-collection-checks"&gt;speed up collections checks&lt;/a&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;$$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;.troubles&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;shouldHave&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;texts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Health&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Emptiness&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Financial Crisis&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Career Pressure&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;One of the optimizations was: if collection size doesn&amp;rsquo;t match the number of expected texts, Selenide doesn&amp;rsquo;t even start loading texts of elements,
but immediately throws an error:&lt;/p&gt;</description></item><item><title>Released Selenide 6.17.2</title><link>https://selenide.org/2023/08/24/selenide-6.17.2/</link><pubDate>Thu, 24 Aug 2023 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2023/08/24/selenide-6.17.2/</guid><description>&lt;p&gt;Good evening!&lt;/p&gt;
&lt;p&gt;Today is August, 24 - Ukraine Independence Day. &lt;br&gt;
And in honor of this holiday - a small release &lt;a href="https://github.com/selenide/selenide/milestone/189?closed=1"&gt;Selenide 6.17.2&lt;/a&gt;.&lt;/p&gt;
&lt;br&gt;
&lt;h3 id="un-hanged-the-hanging-webdriver-again"&gt;Un-hanged the hanging webdriver. Again.&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://selenide.org/2023/08/20/selenide-6.17.1/"&gt;In the previous release&lt;/a&gt;, we fixed the problem with hanging webdriver &lt;em&gt;for most users&lt;/em&gt;.&lt;br&gt;
But the unfortunate ones remained, who are forced to open the tested sites in Chrome through BasicAuth.
For these users, webdriver still hangs.&lt;/p&gt;
&lt;p&gt;What was left for us? We had to revert &lt;a href="https://github.com/selenide/selenide/pull/2358"&gt;CDP-based authentication&lt;/a&gt; until the
&lt;a href="https://github.com/SeleniumHQ/selenium/issues/12576"&gt;webdriver issue&lt;/a&gt; gets fixed.&lt;/p&gt;</description></item><item><title>Released Selenide 6.17.1</title><link>https://selenide.org/2023/08/20/selenide-6.17.1/</link><pubDate>Sun, 20 Aug 2023 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2023/08/20/selenide-6.17.1/</guid><description>&lt;p&gt;Good morning!
Today is August, 20 - &lt;a href="https://www.visitestonia.com/en/why-estonia/estonia-celebrates-regained-independence"&gt;Restoration of Independence day&lt;/a&gt; in Estonia.&lt;/p&gt;
&lt;p&gt;In honor of this holiday - a small release &lt;a href="https://github.com/selenide/selenide/milestone/188?closed=1"&gt;Selenide 6.17.1&lt;/a&gt;!&lt;/p&gt;
&lt;div class="blogpost-menu"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#fix-hanging-webdriver"&gt;Un-hang hanging webdriver&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#support-type-in-mobile-apps"&gt;Added support for &lt;code&gt;$.type()&lt;/code&gt; in mobile apps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#fix-type-with-keys"&gt;Fixed method &lt;code&gt;$.type(Keys.*)&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#remove-spaces-from-texts"&gt;Removed spaces from &lt;code&gt;$$.texts()&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
 &lt;br&gt;
&lt;h3 id="fix-hanging-webdriver"&gt;Un-hang hanging webdriver&lt;/h3&gt;
&lt;p&gt;In Selenide 6.16.0 (&lt;a href="https://github.com/selenide/selenide/pull/2358"&gt;PR 2358&lt;/a&gt;), we occasionally introduced a bug that
caused webdriver hanging in some situations.
More exactly, if you call &lt;code&gt;open(url, pageClass)&lt;/code&gt; twice, then webdriver hangs forever.&lt;/p&gt;</description></item><item><title>Released Selenide 6.17.0</title><link>https://selenide.org/2023/08/02/selenide-6.17.0/</link><pubDate>Wed, 02 Aug 2023 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2023/08/02/selenide-6.17.0/</guid><description>&lt;p&gt;Good morning!&lt;/p&gt;
&lt;p&gt;Don&amp;rsquo;t wait to upgrade to &lt;a href="https://github.com/selenide/selenide/milestone/187?closed=1"&gt;Selenide 6.17.0&lt;/a&gt;!&lt;/p&gt;
&lt;div class="blogpost-menu"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#update-to-selenium-4.11.0"&gt;Upgraded to Selenium 4.11.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#replace-webdrivermanager-by-selenium-manager"&gt;Replaced WebDriverManager by SeleniumManager&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#support-java8-again"&gt;Restored support for Java 8&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#add-method-type"&gt;Added method &lt;code&gt;$.type()&lt;/code&gt; for slow typing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#click-with-long-press"&gt;For mobile apps: click with long press&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#swipe-right-and-left"&gt;For mobile apps: swipe left and right&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#statistics"&gt;Statistics&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
 &lt;br&gt;
&lt;h3 id="update-to-selenium-4.11.0"&gt;Upgraded to Selenium 4.11.0&lt;/h3&gt;
&lt;p&gt;We upgraded Selenium version from 4.10.0 to 4.11.0.&lt;/p&gt;
&lt;p&gt;Read the full Selenium changelog &lt;a href="https://github.com/SeleniumHQ/selenium/blob/trunk/java/CHANGELOG"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;See &lt;a href="https://github.com/selenide/selenide/pull/2393"&gt;PR 2393&lt;/a&gt;.&lt;/p&gt;
&lt;br&gt;
&lt;h3 id="replace-webdrivermanager-by-selenium-manager"&gt;Replaced WebDriverManager by SeleniumManager&lt;/h3&gt;
&lt;p&gt;Starting from version 4.6.0, Selenium has built-in tool for downloading webdriver binaries - SeleniumManager.
Afaik, it&amp;rsquo;s developed by the same &lt;a href="https://bonigarcia.dev/"&gt;Boni Garcia&lt;/a&gt;, who created WebDriverManager.
But now it&amp;rsquo;s an official part of Selenium project.&lt;/p&gt;</description></item><item><title>Released Selenide 6.16.1</title><link>https://selenide.org/2023/07/24/selenide-6.16.1/</link><pubDate>Mon, 24 Jul 2023 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2023/07/24/selenide-6.16.1/</guid><description>&lt;p&gt;Hello, people!&lt;/p&gt;
&lt;p&gt;We released a small update &lt;a href="https://github.com/selenide/selenide/milestone/186?closed=1"&gt;Selenide 6.16.1&lt;/a&gt;.&lt;/p&gt;
&lt;div class="blogpost-menu"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#all-of-and-any-of-conditions"&gt;Added conditions &lt;code&gt;allOf&lt;/code&gt; and &lt;code&gt;anyOf&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#add-checks-for-cookies"&gt;Added checks for cookies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#update-webdrivermanager"&gt;Updated WebDriverManager&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#support-tspan-in-svg"&gt;Fixed support for &lt;code&gt;&amp;lt;tspan&amp;gt;&lt;/code&gt; in SVG&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
 &lt;br&gt;
&lt;h3 id="all-of-and-any-of-conditions"&gt;Added conditions &lt;code&gt;allOf&lt;/code&gt; and &lt;code&gt;anyOf&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Now you can check one of conditions (OR):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;#president&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;shouldHave&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;anyOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Lowlife&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Cowardly bum&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;(in fact, Selenide already had method &lt;code&gt;Condition.or&lt;/code&gt; for the same purpose, but &lt;code&gt;anyOf&lt;/code&gt; seems to be easier to use).&lt;/p&gt;
&lt;p&gt;Also, you can check all conditions (AND):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;#president&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;shouldHave&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;allOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;a catastrophic character&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;another six years of this cowardly bum in power&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;(in fact, it&amp;rsquo;s the same as just &lt;code&gt;$(&amp;quot;#president&amp;quot;).shouldHave(text(..), text(..))&lt;/code&gt;,
but the result of &lt;code&gt;allOf&lt;/code&gt; can be extracted to a variable or method and reused, thus creating your own DSL).&lt;/p&gt;</description></item><item><title>Released Selenide 6.16.0</title><link>https://selenide.org/2023/07/02/selenide-6.16.0/</link><pubDate>Sun, 02 Jul 2023 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2023/07/02/selenide-6.16.0/</guid><description>&lt;p&gt;Good night!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I have an offer for you that you shouldn&amp;rsquo;t refuse.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Upgrade to &lt;a href="https://github.com/selenide/selenide/milestone/185?closed=1"&gt;Selenide 6.16.0&lt;/a&gt;!&lt;/p&gt;
&lt;div class="blogpost-menu"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#speedup-collection-checks"&gt;Speed up collection checks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#improve-collections-error-messages"&gt;Error messages in collection checks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#new-date-checks"&gt;New date checks &lt;code&gt;date(...)&lt;/code&gt; and &lt;code&gt;datetime(...)&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#set-date-time-value"&gt;New methods for setting time&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#full-stacktrace-in-soft-asserts"&gt;Full stacktrace in soft asserts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#improve-basic-auth-in-chromium-browsers"&gt;BasicAuth in Chromium browsers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#multiple-domains-in-basic-auth"&gt;Multiple domains in BasicAuth&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#fix-double-click-in-appium"&gt;Fixed &lt;code&gt;$.doubleClick()&lt;/code&gt; in Appium&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#screenshot-before-after-each"&gt;Take screenshot earlier&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#update-dependencies"&gt;Updated dependencies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#news"&gt;News&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
 &lt;br&gt;
&lt;h3 id="speedup-collection-checks"&gt;Speed up collection checks&lt;/h3&gt;
&lt;p&gt;Here is the coolness!&lt;/p&gt;
&lt;p&gt;One of basic Selenide features is collection checks. With just one line you can check a bunch of elements:&lt;/p&gt;</description></item><item><title>Released Selenide 6.15.0</title><link>https://selenide.org/2023/05/29/selenide-6.15.0/</link><pubDate>Mon, 29 May 2023 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2023/05/29/selenide-6.15.0/</guid><description>&lt;p&gt;Good night!&lt;/p&gt;
&lt;p&gt;We released &lt;a href="https://github.com/selenide/selenide/milestone/184?closed=1"&gt;Selenide 6.15.0&lt;/a&gt;
with quite serious internal changes.&lt;/p&gt;
&lt;div class="blogpost-menu"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#merge-selenide-selenoid-to-selenide"&gt;Merged project &lt;code&gt;selenide-selenoid&lt;/code&gt; into &lt;code&gt;selenide&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#merge-selenide-appium-to-selenide"&gt;Merged project &lt;code&gt;selenide-appium&lt;/code&gt; into &lt;code&gt;selenide&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#clicking-disable-element-fails"&gt;Click checks that element is not disabled&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#escape-newlines-in-report"&gt;Escape newlines in text report&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#combined-selectors-for-mobile-apps"&gt;Combined selectors for mobile apps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#conditions-for-mobile-apps"&gt;New checks for mobile apps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#new-selectors-for-mobile-apps"&gt;New selectors for mobile apps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#switch-context-in-mobile-apps"&gt;Switch context in mobile apps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#refactor-collection-conditions"&gt;Refactoring of CollectionCondition&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#news"&gt;News&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
 &lt;br&gt;
&lt;h3 id="merge-selenide-selenoid-to-selenide"&gt;Merged project &lt;code&gt;selenide-selenoid&lt;/code&gt; into &lt;code&gt;selenide&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;This allows us to easily change and release these projects.
For you, the dependency declaration will change.&lt;/p&gt;</description></item><item><title>Released Selenide 6.14.0</title><link>https://selenide.org/2023/05/08/selenide-6.14.0/</link><pubDate>Mon, 08 May 2023 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2023/05/08/selenide-6.14.0/</guid><description>&lt;p&gt;Good evening!&lt;/p&gt;
&lt;p&gt;Good news: we have released &lt;a href="https://github.com/selenide/selenide/milestone/181?closed=1"&gt;Selenide 6.14.0&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It contains some changes that look minor, but might break something in your tests.
&lt;em&gt;That&amp;rsquo;s why I highly recommend to &lt;strong&gt;upgrade now&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;div class="blogpost-menu"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#speedup-debug"&gt;Sped up debugging&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#remove-flag--no-sandbox"&gt;Removed flag &lt;code&gt;--no-sandbox&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#add-step-method"&gt;Added method &lt;code&gt;step&lt;/code&gt; for reports&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#drag-and-drop-with-options"&gt;Added method &lt;code&gt;$.dragAndDrop(DragAndDropOptions)&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#allow-negative-browser-position"&gt;Browser out of screen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#update-dependencies"&gt;Updated dependencies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#news"&gt;News&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#statistics"&gt;Statistics&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
 &lt;br&gt;
&lt;h3 id="speedup-debug"&gt;Speed up debugging&lt;/h3&gt;
&lt;p&gt;When you are debugging a test and stop at a breakpoint, sometimes IDE is rendering very slowly page object fields.
In this state IDE can hang for quite a long time:&lt;/p&gt;</description></item><item><title>Released Selenide 6.13.0</title><link>https://selenide.org/2023/04/04/selenide-6.13.0/</link><pubDate>Tue, 04 Apr 2023 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2023/04/04/selenide-6.13.0/</guid><description>&lt;p&gt;Good night!&lt;/p&gt;
&lt;p&gt;Today we have a big major release &lt;a href="https://github.com/selenide/selenide/milestone/177?closed=1"&gt;Selenide 6.13.0&lt;/a&gt;.&lt;/p&gt;
&lt;div class="blogpost-menu"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#add-method-cached"&gt;Added method &lt;code&gt;$.cached()&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#mock-response-with-http-status"&gt;Added http status for server response mock&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#add-method-in-new-browser"&gt;Added method &lt;code&gt;inNewBrowser&lt;/code&gt; for running code in a new browser&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#add-method-doubleclick-with-options"&gt;Added method &lt;code&gt;$.doubleClick(options)&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#add-condition-inner-text"&gt;Added condition &lt;code&gt;$.shouldHave(innerText())&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#add-condition-attributes"&gt;Added collection condition &lt;code&gt;$$.shouldHave(attributes(...))&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#clear-error-message-in-select"&gt;Clear error message in methods &lt;code&gt;$.select*()&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#fix-method-sublist"&gt;Fixed bug in &lt;code&gt;$$.subList()&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#update-dependencies"&gt;Updated dependencies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#news"&gt;News&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
 &lt;br&gt;
&lt;h3 id="add-method-cached"&gt;Added method &lt;code&gt;$.cached()&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Sometimes you need to write quite complex code for finding an element.&lt;br&gt;
And it might work &lt;strong&gt;slowly&lt;/strong&gt;, especially if you find it from a long collection applying specific filtering.&lt;br&gt;
Something like this:&lt;/p&gt;</description></item><item><title>Released Selenide 6.13.0</title><link>https://selenide.org/2023/04/01/selenide-6.13.0/</link><pubDate>Sat, 01 Apr 2023 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2023/04/01/selenide-6.13.0/</guid><description>&lt;p&gt;Hi all!&lt;/p&gt;
&lt;p&gt;Wow, today we released &lt;strong&gt;Selenide 6.13.0&lt;/strong&gt;&lt;/p&gt;
&lt;div class="blogpost-menu"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#banners-support"&gt;Banners support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#news"&gt;News&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;h3 id="banners-support"&gt;Banners support&lt;/h3&gt;
&lt;h4 id="the-problem"&gt;The problem&lt;/h4&gt;
&lt;p&gt;People often asked me: &amp;ldquo;What can I do if during a test execution, a banner can appear on the screen (or any other unexpected element)?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Such a banner can cover other elements, can hide some important button - and your test might occasionally get broken.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://selenide.org/2019/12/02/advent-calendar-how-to-abuse-selenide/"&gt;I&amp;rsquo;ve always scolded these questions&lt;/a&gt;
and insisted that you should control your testing environment. You should dictate when the banner should appear, and when it should not.&lt;/p&gt;</description></item><item><title>Released Selenide 6.12.4</title><link>https://selenide.org/2023/03/23/selenide-6.12.4/</link><pubDate>Thu, 23 Mar 2023 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2023/03/23/selenide-6.12.4/</guid><description>&lt;p&gt;Good evening!&lt;/p&gt;
&lt;p&gt;We released &lt;a href="https://github.com/selenide/selenide/milestone/180?closed=1"&gt;Selenide 6.12.4&lt;/a&gt;.&lt;/p&gt;
&lt;div class="blogpost-menu"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#workaround-for-chromedriver-bug"&gt;Workaround for Chromedriver&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#support-jdk-http-client"&gt;Support for jdk-http-client&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#restore-proxy-after-using"&gt;Fixed $.download(PROXY) after "using"&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#fix-clear-when-element-disappears"&gt;Fixed $.clear() when element disappears&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#update-dependencies"&gt;Updated dependencies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#release-selenide-appium"&gt;Released selenide-appium 2.7.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#release-selenide-selenoid"&gt;Released selenide-selenoid 2.3.6&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#news"&gt;News&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;h3 id="workaround-for-chromedriver-bug"&gt;Workaround for Chromedriver&lt;/h3&gt;
&lt;p&gt;Reminder: if you still are looking for a solution for&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Invalid Status code=403 text=Forbidden&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;then it was released in &lt;a href="https://selenide.org/2023/03/09/selenide-6.12.2/"&gt;Selenide 6.12.2&lt;/a&gt;.&lt;/p&gt;
&lt;br&gt;
&lt;h3 id="support-jdk-http-client"&gt;Added support for &lt;code&gt;jdk-http-client&lt;/code&gt; as a replacement for &lt;code&gt;netty-client&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;By default, Selenide still uses old good &lt;code&gt;netty-client&lt;/code&gt;, but if you wish to&lt;br&gt;
&lt;a href="https://www.selenium.dev/blog/2022/using-java11-httpclient/"&gt;upgrade to jdk-http-client&lt;/a&gt;,
now you can easily do that:&lt;/p&gt;</description></item><item><title>Released Selenide 6.12.2</title><link>https://selenide.org/2023/03/09/selenide-6.12.2/</link><pubDate>Thu, 09 Mar 2023 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2023/03/09/selenide-6.12.2/</guid><description>&lt;p&gt;Hi all!&lt;/p&gt;
&lt;p&gt;Urgently update to &lt;a href="https://github.com/selenide/selenide/milestone/178?closed=1"&gt;Selenide 6.12.2&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;It has one important workaround for Chromedriver 111 issue:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Invalid Status code=403 text=Forbidden&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="whats-the-problem"&gt;What&amp;rsquo;s the problem?&lt;/h3&gt;
&lt;p&gt;Recently a new version of Chrome and Chromedriver was released: 111.&lt;/p&gt;
&lt;p&gt;People who did upgrade their browser unexpectedly started getting test failures.&lt;br&gt;
Test tried to open the browser. The browser window appeared, but webdriver received an exception, and could not do
any following actions. In the end, test could not even close that browser!&lt;/p&gt;</description></item><item><title>Released Selenide 6.12.0</title><link>https://selenide.org/2023/02/24/selenide-6.12.0/</link><pubDate>Fri, 24 Feb 2023 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2023/02/24/selenide-6.12.0/</guid><description>&lt;p&gt;Hello!&lt;/p&gt;
&lt;p&gt;On this tragic and festive day, we released
&lt;a href="https://github.com/selenide/selenide/milestone/173?closed=1"&gt;Selenide 6.12.0&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It doesn&amp;rsquo;t contain any new features, but it introduces new headless mode that might affect your tests.&lt;/p&gt;
&lt;div class="blogpost-menu"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#new-headless-mode"&gt;New headless mode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#improve-logs-when-downloading-file"&gt;Improve logging when downloading files&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#improve-download-in-edge"&gt;Improved downloading files in Edge on Windows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#update-dependencies"&gt;Updated dependencies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#rename-master-to-main"&gt;Renamed master to main&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;h3 id="new-headless-mode"&gt;New headless mode&lt;/h3&gt;
&lt;p&gt;In Chromium browsers, a &amp;ldquo;new headless&amp;rdquo; mode has been recently introduced.
Read more details &lt;a href="https://developer.chrome.com/articles/new-headless/"&gt;in their blog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Shortly said, it&amp;rsquo;s a better headless mode that should fix all problems of the &amp;ldquo;old headless&amp;rdquo;.&lt;/p&gt;</description></item><item><title>Released Selenide 6.11.1</title><link>https://selenide.org/2023/01/20/selenide-6.11.1/</link><pubDate>Fri, 20 Jan 2023 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2023/01/20/selenide-6.11.1/</guid><description>&lt;p&gt;Good jan!&lt;/p&gt;
&lt;p&gt;We release a minor update &lt;a href="https://github.com/selenide/selenide/milestone/174?closed=1"&gt;Selenide 6.11.1&lt;/a&gt;.&lt;/p&gt;
&lt;div class="blogpost-menu"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#truncate-webdriver-exception-message"&gt;Truncate only WebDriverException&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#fix-download-to-folder"&gt;Tuned $.download(FOLDER)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#update-dependencies"&gt;Updated dependencies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#statistics"&gt;Statistics&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h3 id="truncate-webdriver-exception-message"&gt;Truncate only &lt;code&gt;WebDriverException&lt;/code&gt; messages&lt;/h3&gt;
&lt;p&gt;In a very rare situation - if you&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;declare a custom command,&lt;/li&gt;
&lt;li&gt;throw some assertion error from it,&lt;/li&gt;
&lt;li&gt;and this error has multi-line message,&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;then Selenide truncates this error message, leaving only the first line.&lt;/p&gt;
&lt;p&gt;Initially, our intention was only to truncate error message of &lt;code&gt;WebDriverException&lt;/code&gt; because it contains multiline garbage:&lt;/p&gt;</description></item><item><title>Released Selenide 6.11.0</title><link>https://selenide.org/2023/01/03/selenide-6.11.0/</link><pubDate>Tue, 03 Jan 2023 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2023/01/03/selenide-6.11.0/</guid><description>&lt;center&gt;
 &lt;img src="https://selenide.org/images/2023/01/selenide-6.11.0.png" width="700"/&gt;
&lt;/center&gt;
&lt;br&gt;
&lt;h1 id="happy-new-year-dear-friends"&gt;Happy New Year, dear friends!&lt;/h1&gt;
&lt;p&gt;Santa Claus brought us a new release &lt;a href="https://github.com/selenide/selenide/milestone/169?closed=1"&gt;Selenide 6.11.0&lt;/a&gt;.&lt;/p&gt;
&lt;div class="blogpost-menu"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#added-copy-paste-methods"&gt;Copy-paste methods&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#fix-download-with-credentials"&gt;Download file behind BasicAuth&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#download-large-files-via-proxy"&gt;Download large files via proxy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#can-handle-unexpected-alerts"&gt;Unexpected alerts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#fix-screenshot-file-permission"&gt;Screenshot file permissions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#support-as-annotation"&gt;Annotation @As for fields without @FindBy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#last-page-source"&gt;Last page source&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#page-url-in-error-message"&gt;Page URL in error message&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h3 id="added-copy-paste-methods"&gt;Added methods to copy and paste text&lt;/h3&gt;
&lt;p&gt;We added two methods:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Selenide.copy()&lt;/code&gt; for copying currently selected text to clipboard, and&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$.paste()&lt;/code&gt; to paste clipboard content into input field.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://best-propaganda-quotes.ru&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;#solovjov&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;doubleClick&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// select the quote text&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Selenide&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;[name=q]&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;paste&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;[name=q]&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;shouldHave&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Life is highly overrated&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Known restrictions: these methods need a graphics environment. So they would not work on server linux.
But simple running &lt;code&gt;xvfb&lt;/code&gt; should help.&lt;/p&gt;</description></item><item><title>Released Selenide 6.10.2</title><link>https://selenide.org/2022/12/08/selenide-6.10.2/</link><pubDate>Thu, 08 Dec 2022 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2022/12/08/selenide-6.10.2/</guid><description>&lt;br&gt;
&lt;h1 id="good-evening"&gt;Good evening!&lt;/h1&gt;
&lt;p&gt;We got mini-release &lt;a href="https://github.com/selenide/selenide/milestone/171?closed=1"&gt;Selenide 6.10.2&lt;/a&gt;.&lt;/p&gt;
&lt;div class="blogpost-menu"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#added-method-press"&gt;Added method $.press()&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#trigger-change-events-by-select-methods"&gt;Trigger change event in $.select*&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#friendly-select-option-in-reports"&gt;selectOption in reports&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#friendly-local-storage-in-reports"&gt;localStorage in reports&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#news"&gt;News&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h3 id="added-method-press"&gt;Added method &lt;code&gt;$.press()&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;It&amp;rsquo;s essentially the same ss &lt;code&gt;sendKeys()&lt;/code&gt;, but it&amp;rsquo;s not &lt;code&gt;void&lt;/code&gt;. You can &lt;em&gt;chain&lt;/em&gt; it with other methods:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;#username&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;press&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;press&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TAB&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CONTROL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ALT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ENTER&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;should&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disappear&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Thanks to &lt;a href="https://github.com/amuthansakthivel"&gt;Amuthan Sakthivel&lt;/a&gt; for &lt;a href="https://github.com/selenide/selenide/pull/2032"&gt;PR 2032&lt;/a&gt;.&lt;/p&gt;
&lt;br&gt;
&lt;h3 id="trigger-change-events-by-select-methods"&gt;Trigger &lt;code&gt;change&lt;/code&gt; event by method &lt;code&gt;$.select*&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;As you remember, in previous release we &lt;a href="https://selenide.org/2022/11/21/selenide-6.10.0/#select-options-using-javascript"&gt;reworked working with selects using JavaScript&lt;/a&gt;.
But we forgot to trigger &lt;code&gt;focus&lt;/code&gt;, &lt;code&gt;click&lt;/code&gt; and &lt;code&gt;change&lt;/code&gt; events. Now we trigger them.&lt;/p&gt;</description></item><item><title>Released Selenide 6.10.0</title><link>https://selenide.org/2022/11/21/selenide-6.10.0/</link><pubDate>Mon, 21 Nov 2022 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2022/11/21/selenide-6.10.0/</guid><description>&lt;br&gt;
&lt;h1 id="evil-evening"&gt;Evil evening!&lt;/h1&gt;
&lt;p&gt;We released &lt;a href="https://github.com/selenide/selenide/milestone/167?closed=1"&gt;Selenide 6.10.0&lt;/a&gt;.&lt;/p&gt;
&lt;div class="blogpost-menu"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#slow-download-in-firefox"&gt;Improved file download algorithm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#fail-download-early"&gt;Fail download early&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#select-options-using-javascript"&gt;Select options using JavaScript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#make-click-chainable"&gt;Made click chainable&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#fix-size-for-new-tabs"&gt;Fixed size of new tabs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#encode-basic-auth-credentials-in-url"&gt;BasicAuth with special characters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#news"&gt;News&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h3 id="slow-download-in-firefox"&gt;Improved file download algorithm&lt;/h3&gt;
&lt;p&gt;Selenide contains several algorithms for downloading files: &lt;code&gt;HTTPGET&lt;/code&gt;, &lt;code&gt;PROXY&lt;/code&gt; and &lt;code&gt;FOLDER&lt;/code&gt;.
Let&amp;rsquo;s talk about &lt;code&gt;FOLDER&lt;/code&gt;.
To download a file, it clicks the button and waits for new files in downloads folder.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;racoons&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;#stolenRaccoonsReport&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;download&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;using&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FOLDER&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;assertThat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;racoons&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;hasName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;racoons.xls&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The problem is that it didn&amp;rsquo;t work well in Firefox in case of very slow download.
We realized that Firefox creates immediately two files: &amp;ldquo;racoons.xls&amp;rdquo; and &amp;ldquo;racoons.xls.part&amp;rdquo; - both are empty.
And only then starts filling &amp;ldquo;racoons.xls.part&amp;rdquo;.&lt;/p&gt;</description></item><item><title>Released Selenide 6.9.0</title><link>https://selenide.org/2022/10/07/selenide-6.9.0/</link><pubDate>Fri, 07 Oct 2022 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2022/10/07/selenide-6.9.0/</guid><description>&lt;br&gt;
&lt;h1 id="yo-seleniders"&gt;Yo Seleniders!&lt;/h1&gt;
&lt;p&gt;Let me break your doomscrolling with some good news.&lt;/p&gt;
&lt;p&gt;We released &lt;a href="https://github.com/selenide/selenide/milestone/166?closed=1"&gt;Selenide 6.9.0&lt;/a&gt;!
Basically, they pumped proxies and updated selenium.&lt;/p&gt;
&lt;div class="blogpost-menu"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#proxy-mock-response"&gt;Fake server response in proxy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#secure-authorization-header"&gt;Authorization header&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resolve-proxy-hostname"&gt;Improve proxy host name&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#upgrade-to-selenium-4.5.0"&gt;Upgrade to Selenium 4.5.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#remove-opera-support"&gt;Drop Opera support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#news"&gt;News&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h3 id="proxy-mock-response"&gt;Now Selenide proxy can mock server response&lt;/h3&gt;
&lt;p&gt;As you know, Selenide can run its own embedded proxy server. It listens requests between browser and other world.
We mostly used it in read-only mode (logging, downloading files). But now you can also change the traffic.
Namely, you can replace server response. It may be useful to mock the response of some service.&lt;/p&gt;</description></item><item><title>Released Selenide 6.8.1</title><link>https://selenide.org/2022/09/27/selenide-6.8.1/</link><pubDate>Tue, 27 Sep 2022 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2022/09/27/selenide-6.8.1/</guid><description>&lt;br&gt;
&lt;h1 id="gooda"&gt;Gooda!&lt;/h1&gt;
&lt;p&gt;Catch min-bugfix &lt;a href="https://github.com/selenide/selenide/milestone/165?closed=1"&gt;Selenide 6.8.1&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This only applies to those who directly call in their tests&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;RemoteWebDriver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;and encountered &lt;code&gt;NoClassDefFoundError&lt;/code&gt; after upgrading to &lt;a href="https://selenide.org/2022/09/24/selenide-6.8.0/"&gt;Selenide 6.8.0&lt;/a&gt;.&lt;/p&gt;
&lt;br/&gt;
&lt;h3 id="pre-history"&gt;Prehistory&lt;/h3&gt;
&lt;p&gt;What is OpenTelemetry?
This is some kind of thing that was added to Selenium 4 for some reason, but nobody really knows why it&amp;rsquo;s needed
and how to use it. :) In fact, no one cares, no one uses it. :)&lt;/p&gt;
&lt;p&gt;In Selenide, we also removed it in &lt;a href="https://github.com/selenide/selenide/pull/1763"&gt;PR 1763&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Released Selenide 6.8.0</title><link>https://selenide.org/2022/09/24/selenide-6.8.0/</link><pubDate>Sat, 24 Sep 2022 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2022/09/24/selenide-6.8.0/</guid><description>&lt;br&gt;
&lt;h1 id="bad-morning"&gt;Bad morning!&lt;/h1&gt;
&lt;p&gt;While the world is going crazy, we are releasing &lt;a href="https://github.com/selenide/selenide/milestone/161?closed=1"&gt;Selenide 6.8.0&lt;/a&gt;.&lt;br&gt;
Not so many features, rather dependency updates.&lt;/p&gt;
&lt;div class="blogpost-menu"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#deep-shadow-selectors"&gt;Recursive search in shadow dom&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#add-page-without-class"&gt;Method page() without parameters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#as-annotation"&gt;Annotation @As&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#news"&gt;News&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h3 id="deep-shadow-selectors"&gt;Recursive search in shadow dom&lt;/h3&gt;
&lt;p&gt;As you probably know, Selenide has &lt;a href="https://selenide.org/2020/03/18/selenide-5.10.0"&gt;methods&lt;/a&gt; to find elements inside shadow dom.
And even in multiple embedded shadow doms:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;shadowCss&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;#reportButton&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;#shadow-host&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;#inner-shadow-host&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="na"&gt;click&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;But you still need to waste time to investigate these doms and find proper locators for all those shadow roots.&lt;/p&gt;</description></item><item><title>Released Selenide 6.7.4</title><link>https://selenide.org/2022/09/05/selenide-6.7.4/</link><pubDate>Mon, 05 Sep 2022 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2022/09/05/selenide-6.7.4/</guid><description>&lt;br&gt;
&lt;h1 id="hey-there"&gt;Hey there!&lt;/h1&gt;
&lt;br&gt;
&lt;p&gt;We did yet another nano-release &lt;a href="https://github.com/selenide/selenide/milestone/164?closed=1"&gt;Selenide 6.7.4&lt;/a&gt;.&lt;/p&gt;
&lt;br&gt;
&lt;h3 id="add-remote-read-setting"&gt;Added setting &lt;code&gt;remoteReadTimeout&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;I recently &lt;a href="https://www.youtube.com/watch?v=-KGtZoFVzr8&amp;amp;list=PL9Z-JgiTsOYRfoG_mcRBlTUIFPIknhQ6S"&gt;complained about&lt;/a&gt; too many settings in Selenide.&lt;/p&gt;
&lt;p&gt;Nevertheless, we added yet another setting &lt;code&gt;Configuration.remoteReadTimeout&lt;/code&gt; (a.k.a. &lt;code&gt;-Dselenide.remoteReadTimeout&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;It may be useful if you run browser on a remote server, but the number if browser is limited on that server, and
your tests need to wait in a queue for a free browser. In this case the default timeout for 1.5 minutes might not be
enough, and you need to increase the timeout.&lt;/p&gt;</description></item><item><title>Released Selenide 6.7.3</title><link>https://selenide.org/2022/08/27/selenide-6.7.3/</link><pubDate>Sat, 27 Aug 2022 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2022/08/27/selenide-6.7.3/</guid><description>&lt;br&gt;
&lt;h1 id="good-saturday"&gt;Good saturday!&lt;/h1&gt;
&lt;br&gt;
&lt;p&gt;You are reading release notes for &lt;a href="https://github.com/selenide/selenide/milestone/163?closed=1"&gt;Selenide 6.7.3&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="condition-partial-value"&gt;Added condition &lt;code&gt;partialValue&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Similarly to &lt;code&gt;$.shouldHave(partialText(&amp;quot;Good Co&amp;quot;))&lt;/code&gt;, now you have &lt;code&gt;$.shouldHave(partialValue(&amp;quot;Cola&amp;quot;))&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s needed if you set &lt;code&gt;Configuration.textCheck = FULL_TEXT&lt;/code&gt;, but need to check a value of some input or textarea &lt;em&gt;partially&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;See &lt;a href="https://github.com/selenide/selenide/issues/1923"&gt;issue 1923&lt;/a&gt; and &lt;a href="https://github.com/selenide/selenide/pull/1924"&gt;PR 1924&lt;/a&gt;.&lt;/p&gt;
&lt;br&gt;
&lt;h3 id="condition-tag-name"&gt;Added condition &lt;code&gt;tagName&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;You probably don&amp;rsquo;t need it often. Because we often find element by the tag, and only then verify some its attributes.&lt;/p&gt;
&lt;p&gt;Anyway, now you can verify the tag name of an element:&lt;/p&gt;</description></item><item><title>Selenide puzzler</title><link>https://selenide.org/2022/08/22/selenide-puzzler/</link><pubDate>Mon, 22 Aug 2022 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2022/08/22/selenide-puzzler/</guid><description>&lt;br&gt;
&lt;h1 id="good-night"&gt;Good night!&lt;/h1&gt;
&lt;p&gt;Do you love puzzlers?
Did you miss puzzlers?&lt;/p&gt;
&lt;p&gt;We recently published a new &lt;a href="https://twitter.com/selenide/status/1560192824536088580"&gt;puzzler in Twitter&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Do these lines work equally? Or is there some difference?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;.btn&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;shouldBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;visible&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;.btn&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;shouldBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;visible&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;shouldBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="answer-options"&gt;Answer options&lt;/h3&gt;
&lt;p&gt;You gave us many answers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;both lines work equally (the most popular answer)&lt;/li&gt;
&lt;li&gt;the first case is &amp;ldquo;logical or&amp;rdquo;, and the second is &amp;ldquo;logical and&amp;rdquo;&lt;/li&gt;
&lt;li&gt;the second runs %timeout% seconds longer&lt;/li&gt;
&lt;li&gt;the first runs with one timeout, the second run with two timeouts&lt;/li&gt;
&lt;li&gt;the first fails if one of conditions is false, the second fails if the element is not visible, but is enabled.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="correct-answer"&gt;Correct answer&lt;/h3&gt;
&lt;p&gt;In most cases both variants work equally.&lt;/p&gt;</description></item><item><title>Released Selenide 6.7.2</title><link>https://selenide.org/2022/08/14/selenide-6.7.2/</link><pubDate>Sun, 14 Aug 2022 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2022/08/14/selenide-6.7.2/</guid><description>&lt;br&gt;
&lt;h1 id="good-sunday"&gt;Good Sunday!&lt;/h1&gt;
&lt;br&gt;
&lt;p&gt;We made a mini-release &lt;a href="https://github.com/selenide/selenide/milestone/162?closed=1"&gt;Selenide 6.7.2&lt;/a&gt; fixing a few memory leaks.&lt;/p&gt;
&lt;p&gt;But don&amp;rsquo;t worry, they are non-critical. It is unlikely that any of you even noticed them.&lt;/p&gt;
&lt;h3 id="fix-selenide-memory-leak"&gt;Fixed a memory leak with shutdown hooks in Selenide&lt;/h3&gt;
&lt;p&gt;If you open and close a browser multiple times in a test&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;about:blank&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;closeWebDriver&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;then memory consumption starts growing:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://user-images.githubusercontent.com/279773/184475079-bbf8ee0f-d245-43ec-8e72-a010262e099c.png"
style="width: 100%" alt="Memory consumption: before"/&gt;&lt;/p&gt;</description></item><item><title>Released Selenide 6.7.0</title><link>https://selenide.org/2022/08/04/selenide-6.7.0/</link><pubDate>Thu, 04 Aug 2022 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2022/08/04/selenide-6.7.0/</guid><description>&lt;br&gt;
&lt;h1 id="good-day"&gt;Good day!&lt;/h1&gt;
&lt;br&gt;
&lt;p&gt;We&amp;rsquo;ve got a big release &lt;a href="https://github.com/selenide/selenide/milestone/154?closed=1"&gt;Selenide 6.7.0&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="holy-whole-string"&gt;Now &lt;code&gt;$.shouldHave(text)&lt;/code&gt; can verify the whole text&lt;/h3&gt;
&lt;p&gt;From the very beginning, command &lt;code&gt;$.shouldHave(text)&lt;/code&gt; verified the text &lt;em&gt;partially&lt;/em&gt;, not the whole text:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;freedom-to&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Britney Spears&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;#freedom-to&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;shouldHave&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Brit&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// was OK&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Initially, this seemed like a good idea, because a web page often contains all sorts of inconsiderable/invisible characters.
(newlines, tab characters, non-portable spaces, multiple spaces, etc.).&lt;/p&gt;
&lt;p&gt;But now it seems that it was still a bad idea, because beginners assume by default that the text is verified entirely, and
snatch their portion of WTF moments when they discover that all their checks were checking a little wrong. :)&lt;/p&gt;</description></item><item><title>Released Selenide 6.6.6</title><link>https://selenide.org/2022/07/01/selenide-6.6.6/</link><pubDate>Fri, 01 Jul 2022 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2022/07/01/selenide-6.6.6/</guid><description>&lt;br&gt;
&lt;h1 id="good-evening"&gt;Good evening!&lt;/h1&gt;
&lt;br&gt;
&lt;p&gt;We made another release &lt;a href="https://github.com/selenide/selenide/milestone/160?closed=1"&gt;Selenide 6.6.6&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="remove-deprecated-capabilities"&gt;Removed deprecated capabilities&lt;/h3&gt;
&lt;p&gt;Some webdriver options (which Selenide has been setting for years) were later marked as deprecated.&lt;br&gt;
Starting from some release, Selenium started logging warnings about them.&lt;/p&gt;
&lt;p&gt;Now Selenide doesn&amp;rsquo;t set them anymore: &lt;code&gt;acceptSslCerts&lt;/code&gt;, &lt;code&gt;handlesAlerts&lt;/code&gt;, &lt;code&gt;javascriptEnabled&lt;/code&gt;, &lt;code&gt;takesScreenshot&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;We will not forget you, friends! You have served us faithfully for over 10 years.&lt;/p&gt;
&lt;p&gt;See &lt;a href="https://github.com/selenide/selenide/issues/1862"&gt;issue 1862&lt;/a&gt;, &lt;a href="https://github.com/selenide/selenide/issues/1866"&gt;issue 1866&lt;/a&gt;
and &lt;a href="https://github.com/selenide/selenide/pull/1870"&gt;PR 1870&lt;/a&gt;.&lt;/p&gt;
&lt;br&gt;
&lt;h3 id="fix-clear-with-shortcut"&gt;Fixed ClearWithShortcut&lt;/h3&gt;
&lt;p&gt;&amp;hellip; when working with driver wrapped into listeners. It&amp;rsquo;s rare, don&amp;rsquo;t worry.&lt;/p&gt;</description></item><item><title>Released Selenide 6.6.4</title><link>https://selenide.org/2022/06/20/selenide-6.6.4/</link><pubDate>Mon, 20 Jun 2022 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2022/06/20/selenide-6.6.4/</guid><description>&lt;br&gt;
&lt;h1 id="gootas-morningas"&gt;Gootas morningas!&lt;/h1&gt;
&lt;br&gt;
&lt;p&gt;We made another mini-released &lt;a href="https://github.com/selenide/selenide/milestone/158?closed=1"&gt;Selenide 6.6.4&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="exact-texts-case-sensitive"&gt;Added condition &lt;code&gt;exactTextsCaseSensitive&lt;/code&gt; for collections&lt;/h3&gt;
&lt;p&gt;Selenide has several built-in checks for collections texts:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;$$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;li&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;shouldHave&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;texts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;foo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;bar&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;baz&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;$$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;li&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;shouldHave&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;textsInAnyOrder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;foo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;bar&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;baz&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;$$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;li&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;shouldHave&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exactTexts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;foo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;bar&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;baz&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// etc.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now there is one more check available:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;$$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;li&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;shouldHave&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exactTextsCaseSensitive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;foo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;bar&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;baz&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Thanks to &lt;a href="https://github.com/ben-nc2"&gt;Ben Heap&lt;/a&gt; for &lt;a href="https://github.com/selenide/selenide/pull/1861"&gt;PR 1861&lt;/a&gt;.&lt;/p&gt;
&lt;br&gt;
&lt;h3 id="selected-option-lazy-loaded"&gt;Made method &lt;code&gt;$.getSelectedOption()&lt;/code&gt; lazy&lt;/h3&gt;
&lt;p&gt;By design, (almost) all Selenide methods &lt;a href="https://github.com/selenide/selenide/wiki/Lazy-loading"&gt;should be lazy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For example, call to &lt;code&gt;$(&amp;quot;#nope&amp;quot;)&lt;/code&gt; does NOT fail even if the element doesn&amp;rsquo;t exist. It allows writing negative checks, e.g.&lt;/p&gt;</description></item><item><title>Released Selenide 6.6.3</title><link>https://selenide.org/2022/06/12/selenide-6.6.3/</link><pubDate>Sun, 12 Jun 2022 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2022/06/12/selenide-6.6.3/</guid><description>&lt;br&gt;
&lt;h1 id="good-evening-fellows"&gt;Good evening fellows!&lt;/h1&gt;
&lt;br&gt;
&lt;p&gt;We made a mini-release &lt;a href="https://github.com/selenide/selenide/milestone/157?closed=1"&gt;Selenide 6.6.3&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="improve-click-timeout"&gt;Improved timeout for &lt;code&gt;$.click()&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;In version 6.6.0, we added an optional parameter &lt;code&gt;timeout&lt;/code&gt; for method &lt;code&gt;$.click()&lt;/code&gt;.&lt;br&gt;
But it appeared that it &lt;a href="https://selenide.org/2022/06/08/selenide-6.6.0/#click-timeout"&gt;only partially&lt;/a&gt; solved the problem.&lt;/p&gt;
&lt;p&gt;Now we improved it: method&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;#slow-link&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;click&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;usingDefaultMethod&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ofSeconds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;waits 8 seconds for both the element itself and the following page loading.&lt;/p&gt;
&lt;p&gt;See &lt;a href="https://github.com/selenide/selenide/issues/1572"&gt;issue 1572&lt;/a&gt; and &lt;a href="https://github.com/selenide/selenide/pull/1853"&gt;PR 1853&lt;/a&gt;.&lt;/p&gt;
&lt;br&gt;
&lt;h3 id="selenide-6.6.2"&gt;Selenide 6.6.2&lt;/h3&gt;
&lt;p&gt;A day before, we released &lt;a href="https://github.com/selenide/selenide/milestone/156?closed=1"&gt;Selenide 6.6.2&lt;/a&gt; with upgrade to Selenium 4.2.2&lt;/p&gt;
&lt;p&gt;See &lt;a href="https://github.com/selenide/selenide/pull/1851"&gt;PR 1851&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Released Selenide 6.6.0</title><link>https://selenide.org/2022/06/08/selenide-6.6.0/</link><pubDate>Wed, 08 Jun 2022 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2022/06/08/selenide-6.6.0/</guid><description>&lt;br&gt;
&lt;h1 id="good-morning-friends"&gt;Good morning, friends!&lt;/h1&gt;
&lt;br&gt;
&lt;p&gt;We released &lt;a href="https://github.com/selenide/selenide/milestone/152?closed=1"&gt;Selenide 6.6.0&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="selenide-clear-with-shortcut"&gt;Added new Selenide plugin &lt;code&gt;selenide-clear-with-shortcut&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;In Selenide 6.5.0, we changed the implementation of &lt;code&gt;$.clear()&lt;/code&gt; method from a standard WebDriver to a shortcut (&amp;ldquo;Select all&amp;rdquo; -&amp;gt; &amp;ldquo;Delete&amp;rdquo;).&lt;br&gt;
Later we realized this shortcut didn&amp;rsquo;t work stably in all browsers, we had to rework it. It got more stable, but slower.
And since it&amp;rsquo;s not really needed for all, we decided to return the old good &lt;code&gt;WebElement.clear()&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Released Selenide 6.5.0</title><link>https://selenide.org/2022/05/17/selenide-6.5.0/</link><pubDate>Tue, 17 May 2022 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2022/05/17/selenide-6.5.0/</guid><description>&lt;br&gt;
&lt;h1 id="good-night"&gt;Good night!&lt;/h1&gt;
&lt;br&gt;
&lt;p&gt;We released &lt;a href="https://github.com/selenide/selenide/milestone/151?closed=1"&gt;Selenide 6.5.0&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="now-you-can-mask-passwords-in-reports"&gt;Now you can mask passwords in reports&lt;/h3&gt;
&lt;p&gt;Sometimes you need to type passwords and other sensitive data into input fields. Sometimes people don&amp;rsquo;t want this
data to be visible in test reports (e.g. Allure or TextReport). And ask to hide this sensitive data somehow.&lt;/p&gt;
&lt;p&gt;I personally never understood why it&amp;rsquo;s a problem.&lt;br&gt;
Why the password from test environment should be a problem?&lt;br&gt;
You don&amp;rsquo;t use the same password in production, right?&lt;br&gt;
You don&amp;rsquo;t run tests in production, right?&lt;/p&gt;</description></item><item><title>Released Selenide 6.4.0</title><link>https://selenide.org/2022/04/07/selenide-6.4.0/</link><pubDate>Thu, 07 Apr 2022 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2022/04/07/selenide-6.4.0/</guid><description>&lt;br&gt;
&lt;h1 id="good-evening-friends"&gt;Good evening, friends!&lt;/h1&gt;
&lt;br&gt;
&lt;p&gt;We released &lt;a href="https://github.com/selenide/selenide/milestone/145?closed=1"&gt;Selenide 6.4.0&lt;/a&gt;.&lt;/p&gt;
&lt;br&gt;
&lt;h2 id="now-we-show-both-alias-and-locator-on-test-failure"&gt;Now we show both alias and locator on test failure&lt;/h2&gt;
&lt;p&gt;In Selenide, you can use method &lt;code&gt;as&lt;/code&gt; to give web elements readable names.&lt;br&gt;
It may be useful when the element has no good ID/class, and you have no choice but write long ugly unreadable xpath.
It&amp;rsquo;s hard to read such selectors in reports.&lt;/p&gt;
&lt;p&gt;Sample usage of &lt;code&gt;as&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;$x&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/long/ugly/xpath/div[2]/span[3]/li[4]&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;as&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Login button&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;click&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We always had a dilemma: should Selenide&lt;/p&gt;</description></item><item><title>Released Selenide 6.3.0</title><link>https://selenide.org/2022/02/07/selenide-6.3.0/</link><pubDate>Mon, 07 Feb 2022 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2022/02/07/selenide-6.3.0/</guid><description>&lt;br&gt;
&lt;h1 id="hello-people"&gt;Hello, people!&lt;/h1&gt;
&lt;br&gt;
&lt;p&gt;We released &lt;a href="https://github.com/selenide/selenide/milestone/143?closed=1"&gt;Selenide 6.3.0&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s review what&amp;rsquo;s changed?&lt;/p&gt;
&lt;br&gt;
&lt;h1 id="added-methods-switchtoframetimeout-with-custom-timeout"&gt;Added methods &lt;code&gt;switchTo().frame(timeout)&lt;/code&gt; with custom timeout&lt;/h1&gt;
&lt;p&gt;Selenide has methods &lt;code&gt;switchTo().frame(name)&lt;/code&gt; for switching between frames. As usually, with built-in waiting and other bonuses.&lt;br&gt;
But what if the frame is being loaded longer than the default timeout (4 seconds)?&lt;/p&gt;
&lt;p&gt;Now you can pass an additional parameter &lt;code&gt;Duration&lt;/code&gt; - the timeout for switching into the frame:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;switchTo&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ifrm&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// waits up to default timeout (4 seconds)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;switchTo&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ifrm&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Duration&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ofSeconds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;6&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// waits up to 6 seconds&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Thanks to &lt;a href="https://github.com/donesvad"&gt;@donesvad&lt;/a&gt; for &lt;a href="https://github.com/selenide/selenide/pull/1722"&gt;PR 1722&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Released Selenide 6.2.0</title><link>https://selenide.org/2022/01/10/selenide-6.2.0/</link><pubDate>Mon, 10 Jan 2022 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2022/01/10/selenide-6.2.0/</guid><description>&lt;br&gt;
&lt;h1 id="happy-new-year-people"&gt;Happy New Year, people!&lt;/h1&gt;
&lt;br&gt;
&lt;p&gt;We released &lt;a href="https://github.com/selenide/selenide/milestone/140?closed=1"&gt;Selenide 6.2.0&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s look into this year&amp;rsquo;s first release.&lt;/p&gt;
&lt;p&gt;Pour some tea and let&amp;rsquo;s go!&lt;/p&gt;
&lt;br&gt;
&lt;h1 id="added-link-click-to-see-difference-for-most-of-selenide-assertion-errors"&gt;Added link &amp;ldquo;&amp;lt;Click to see difference&amp;gt;&amp;rdquo; for most of Selenide assertion errors&lt;/h1&gt;
&lt;p&gt;As you remember, in &lt;a href="https://selenide.org/2021/09/28/selenide-5.25.0/"&gt;Selenide 5.25.0&lt;/a&gt; we added Test4J support. As a result, Selenide
assertion errors got a link &amp;ldquo;&amp;lt;Click to see difference&amp;gt;&amp;rdquo; in IDE which allows to easily compare expected and actual
values in case of test failure.&lt;/p&gt;</description></item><item><title>Released Selenide 6.1.1</title><link>https://selenide.org/2021/11/24/selenide-6.1.1/</link><pubDate>Wed, 24 Nov 2021 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2021/11/24/selenide-6.1.1/</guid><description>&lt;br&gt;
&lt;h1 id="tere-hommikust"&gt;TERE HOMMIKUST!&lt;/h1&gt;
&lt;br&gt;
&lt;p&gt;We released &lt;a href="https://github.com/selenide/selenide/milestone/141?closed=1"&gt;Selenide 6.1.1&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In this tiny release we fixed a bunch of problems with browser settings.&lt;br&gt;
These problems arose after upgrading to Selenium 4 where &lt;code&gt;ChromeOptions&lt;/code&gt; and other &lt;code&gt;Capabilities&lt;/code&gt; were refactored.&lt;/p&gt;
&lt;p&gt;Now we plunged into the topic and fixed all the problems at once.&lt;/p&gt;
&lt;br&gt;
&lt;h1 id="early-conflicts-detection"&gt;Early conflict detection&lt;/h1&gt;
&lt;p&gt;If you try to open a Chrome with Firefox settings:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Configuration&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;browser&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;chrome&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Configuration&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;browserCapabilities&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setCapability&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FIREFOX_OPTIONS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;FirefoxOptions&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;then Selenide 5.x did show a clear error message, but Selenide 6.0.x didn&amp;rsquo;t.&lt;br&gt;
Now we have restored the swearing, and you will see the old good&lt;/p&gt;</description></item><item><title>Released Selenide 6.1.0</title><link>https://selenide.org/2021/11/23/selenide-6.1.0/</link><pubDate>Tue, 23 Nov 2021 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2021/11/23/selenide-6.1.0/</guid><description>&lt;br&gt;
&lt;h1 id="tere"&gt;TERE!&lt;/h1&gt;
&lt;br&gt;
&lt;p&gt;We released &lt;a href="https://github.com/selenide/selenide/milestone/137?closed=1"&gt;Selenide 6.1.0&lt;/a&gt;.&lt;/p&gt;
&lt;br&gt;
&lt;h1 id="added-support-for-selenideproperties"&gt;Added support for &lt;code&gt;selenide.properties&lt;/code&gt;&lt;/h1&gt;
&lt;p&gt;Now Selenide can read its settings from file &lt;code&gt;selenide.properties&lt;/code&gt; if it&amp;rsquo;s found in classpath.&lt;/p&gt;
&lt;p&gt;NB! I personally still don&amp;rsquo;t find it really useful. It&amp;rsquo;s easier to just set settings&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;right in code: &lt;code&gt;Configuration.timeout = 8000;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;or via system properties: &lt;code&gt;-Dselenide.timeout=8000&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Please, don&amp;rsquo;t rush generating these files. Use &lt;code&gt;selenide.properties&lt;/code&gt; only if you have a good reason,
and not simply because it is now fashionable or &amp;ldquo;beautiful&amp;rdquo;.&lt;/p&gt;</description></item><item><title>Released Selenide 6.0.1</title><link>https://selenide.org/2021/10/25/selenide-6.0.1/</link><pubDate>Mon, 25 Oct 2021 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2021/10/25/selenide-6.0.1/</guid><description>&lt;br&gt;
&lt;h1 id="happy-birthday-selenide"&gt;Happy Birthday, Selenide!&lt;/h1&gt;
&lt;p&gt;Wow! It&amp;rsquo;s hard to believe, but today Selenide got &amp;hellip; 10 years old!&lt;/p&gt;
&lt;p&gt;This day 10 years ago was created &lt;a href="https://github.com/selenide/selenide/commit/3716078fc7fda8c5da01d871882d513cbd97cd0e"&gt;the first commit&lt;/a&gt; to Selenide github repository.&lt;/p&gt;
&lt;p&gt;Many thanks to everyone who participated in the project, committed, reported bugs, suggested ideas, answered questions in the forums,
criticized and talked about selenide at conferences and meetups. And who just decided to use Selenide in their projects.
You are all part of this movement.&lt;/p&gt;</description></item><item><title>Released Selenide 5.25.0</title><link>https://selenide.org/2021/09/28/selenide-5.25.0/</link><pubDate>Tue, 28 Sep 2021 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2021/09/28/selenide-5.25.0/</guid><description>&lt;p&gt;Good evening!&lt;/p&gt;
&lt;p&gt;We released &lt;a href="https://github.com/selenide/selenide/milestone/131?closed=1"&gt;Selenide 5.25.0&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;I strongly recommend you to upgrade&lt;/strong&gt;,&lt;br&gt;
because there are even more changes coming with next releases, including the full release of Selenium 4.&lt;br&gt;
If you don&amp;rsquo;t upgrade now, it will be much more difficult to clear the rubble later!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is quite a big release with a bunch of changes, so grab some popcorn and make some tea. Let&amp;rsquo;s go!&lt;/p&gt;
&lt;div class="blogpost-menu"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#support-webdriver-4.0.0.RC1"&gt;Support for Selenium Webdriver 4.0.0 RC1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#opentest4j"&gt;Support for OpenTest4j&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#stacktrace-in-soft-asserts"&gt;Stacktrace below every error in soft asserts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#get-shadow-root"&gt;Added method &lt;code&gt;$.shadowRoot()&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#get-ancestor"&gt;Added method &lt;code&gt;$.ancestor()&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#enrich-ancestor"&gt;Enriched methods &lt;code&gt;$.closest()&lt;/code&gt; and &lt;code&gt;$.ancestor()&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#fixed-element-screenshot"&gt;Fixed method &lt;code&gt;$.screenshot()&lt;/code&gt; on Mac&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#actual-value-at-the-moment-of-last-check"&gt;Now Selenide reports an exact text at the moment of test failure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#empty-text-not-allowed"&gt;We now forbid an empty argument in method &lt;code&gt;$.matchText("")&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#check-webdriver-title"&gt;Check &lt;code&gt;webdriver().shouldHave(title(...))&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#release-selenide-selenoid-1.2.0"&gt;selenide-selenoid 1.2.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#release-selenide-appium-1.7.0"&gt;selenide-appium 1.7.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#statistics"&gt;Selenide downloads statistics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#selenide-anniversary"&gt;Selenide anniversary&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;h1 id="support-webdriver-4.0.0.RC1"&gt;Support for Selenium Webdriver 4.0.0 RC1&lt;/h1&gt;
&lt;p&gt;We released two builds of Selenide 5.25.0: regular and hipster one.&lt;br&gt;
You can pick:&lt;/p&gt;</description></item><item><title>Released Selenide 5.24.0</title><link>https://selenide.org/2021/08/29/selenide-5.24.0/</link><pubDate>Sun, 29 Aug 2021 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2021/08/29/selenide-5.24.0/</guid><description>&lt;p&gt;On August 29, 1997 a computer system Skynet became self-aware and launched nuclear missiles at Russia.
So the war between humans and terminators began.&lt;/p&gt;
&lt;p&gt;It happened .. oh, my god! - 24 years ago. We live in the Future, and we are still alive. And we still rule the machines.&lt;/p&gt;
&lt;p&gt;I
I celebrate this day every year, and today, in honor of the holiday, we released &lt;a href="https://github.com/selenide/selenide/milestone/130?closed=1"&gt;Selenide 5.24.0&lt;/a&gt;.&lt;/p&gt;
&lt;br&gt;
&lt;h1 id="we-added-method-executecommand-duration"&gt;We added method &lt;code&gt;$.execute(Command, Duration)&lt;/code&gt;&lt;/h1&gt;
&lt;p&gt;to run custom commands with a custom timeout.&lt;/p&gt;</description></item><item><title>Released Selenide 5.23.0</title><link>https://selenide.org/2021/07/16/selenide-5.23.0/</link><pubDate>Fri, 16 Jul 2021 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2021/07/16/selenide-5.23.0/</guid><description>&lt;p&gt;Good summer day!&lt;/p&gt;
&lt;p&gt;We released &lt;a href="https://github.com/selenide/selenide/milestone/125?closed=1"&gt;Selenide 5.23.0&lt;/a&gt; on July, 16.&lt;/p&gt;
&lt;p&gt;It introduces a fundamentally new feature in Selenide:&lt;/p&gt;
&lt;h1 id="the-new-generation-checks"&gt;The new generation checks&lt;/h1&gt;
&lt;p&gt;Now Selenide has checks not only for &lt;em&gt;web&lt;/em&gt; elements, but for some other elements too.
You can apply those checks with built-in waitings, readable error messages, reports etc. Everything you like.&lt;/p&gt;
&lt;p&gt;See &lt;a href="https://github.com/selenide/selenide/issues/1442"&gt;issue 1442&lt;/a&gt;.
Thanks to &lt;a href="https://github.com/dbudim"&gt;Dmitriy Budim&lt;/a&gt; for launching this whole epic in &lt;a href="https://github.com/selenide/selenide/pull/1478"&gt;PR 1478&lt;/a&gt;.&lt;/p&gt;
&lt;br/&gt;
&lt;p&gt;Let&amp;rsquo;s look at these checks.&lt;/p&gt;</description></item><item><title>Released Selenide 5.22.3</title><link>https://selenide.org/2021/07/05/selenide-5.22.3/</link><pubDate>Mon, 05 Jul 2021 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2021/07/05/selenide-5.22.3/</guid><description>&lt;p&gt;Good evening!&lt;/p&gt;
&lt;p&gt;There was a press release here that might hurt the feelings of many of our users and committers. We regret that this has happened, and we consider this publication to be our mistake, a manifestation of the unprofessionalism of certain maintainers.&lt;/p&gt;
&lt;p&gt;So just upgrade to &lt;a href="https://github.com/selenide/selenide/milestone/126?closed=1"&gt;Selenide 5.22.3&lt;/a&gt; with the most fresh and delicious bugfixes.&lt;/p&gt;
&lt;h3 id="5223-released-05072021"&gt;5.22.3 (released 05.07.2021)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/selenide/selenide/issues/1474"&gt;#1474&lt;/a&gt; add workaround for NPE in RemoteWebElement.isDisplayed() &amp;ndash; see &lt;a href="https://github.com/selenide/selenide/pull/1498"&gt;PR #1498&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="5222-released-30062021"&gt;5.22.2 (released 30.06.2021)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/selenide/selenide/issues/1493"&gt;#1493&lt;/a&gt; support uploading files from inside of JAR files &amp;ndash; see &lt;a href="https://github.com/selenide/selenide/pull/1494"&gt;PR #1494&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;fix command &lt;code&gt;./gradlew&lt;/code&gt; - now it installs jars to a local maven repo &amp;ndash; see &lt;a href="https://github.com/selenide/selenide/pull/1489"&gt;PR #1489&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;add support for okhttp 4.9.1 &amp;ndash; see &lt;a href="https://github.com/selenide/selenide/pull/1488"&gt;PR #1488&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="5221-released-18062021"&gt;5.22.1 (released 18.06.2021)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Add mime type &amp;ldquo;binary/octet-stream&amp;rdquo; to download binary files in FireFox&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;center&gt;
 &lt;a href="https://www.bbc.com/news/world-europe-57720890"&gt;
 &lt;img src="https://selenide.org/images/2021/07/selenide-5.22.3.png" width="800"/&gt;
 &lt;/a&gt;
&lt;/center&gt;
&lt;h3 id="have-a-carefree-summer"&gt;Have a carefree summer!&lt;/h3&gt;
&lt;br&gt;
&lt;p&gt;&lt;a href="http://asolntsev.github.io/"&gt;Andrei Solntsev&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Released Selenide 5.22.0</title><link>https://selenide.org/2021/06/08/selenide-5.22.0/</link><pubDate>Tue, 08 Jun 2021 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2021/06/08/selenide-5.22.0/</guid><description>&lt;p&gt;Good morning!&lt;/p&gt;
&lt;p&gt;For my birthday, we made an anniversary release &lt;a href="https://github.com/selenide/selenide/milestone/124?closed=1"&gt;Selenide 5.22.0&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s unbox the gift!&lt;/p&gt;
&lt;br&gt;
&lt;h1 id="now-you-can-close-an-alert-to-download-a-file"&gt;Now you can close an alert to download a file&lt;/h1&gt;
&lt;p&gt;Selenide has method &lt;code&gt;$.download()&lt;/code&gt; which works by a very simple principle:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Click&lt;/li&gt;
&lt;li&gt;Wait for a new file in a downloads folder&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The problem is that some websites show an alert or some other dialog, and you need to close it to start downloading the file. Generally, you might need to perform some action to start the download process.&lt;/p&gt;</description></item><item><title>Released Selenide 5.21.0</title><link>https://selenide.org/2021/05/15/selenide-5.21.0/</link><pubDate>Sat, 15 May 2021 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2021/05/15/selenide-5.21.0/</guid><description>&lt;p&gt;Good evening!&lt;/p&gt;
&lt;p&gt;We have released &lt;a href="https://github.com/selenide/selenide/milestone/123?closed=1"&gt;Selenide 5.21.0&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;What&amp;rsquo;s new there?&lt;/p&gt;
&lt;br&gt;
&lt;h1 id="we-removed-duplicate-screenshots-for-chained-locators"&gt;We removed duplicate screenshots for chained locators&lt;/h1&gt;
&lt;p&gt;Most of Selenide methods are &lt;em&gt;chainable&lt;/em&gt; (aka &lt;em&gt;fluent&lt;/em&gt;), so that you can call multiple methods in a line.
Thus way you can write concise tests.&lt;/p&gt;
&lt;p&gt;Something like&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;table#id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;tbody&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;2&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;tr.active&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;td&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;shouldHave&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Foo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;click&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;But there has been a problem with chained calls. If such a check failed, Selenide took multiple screenshots and
added multiple steps to the report (incl. Allure report). One screenshot for &lt;code&gt;&amp;quot;table#id&amp;quot;&lt;/code&gt;, another for &lt;code&gt;&amp;quot;tbody&amp;quot;&lt;/code&gt; etc.&lt;br&gt;
Though it&amp;rsquo;s essentially a single step.&lt;/p&gt;</description></item><item><title>Released Selenide 5.20.1</title><link>https://selenide.org/2021/03/23/selenide-5.20.1/</link><pubDate>Tue, 23 Mar 2021 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2021/03/23/selenide-5.20.1/</guid><description>&lt;p&gt;Good night!&lt;/p&gt;
&lt;p&gt;Joe Biden was asked if he thinks &lt;code&gt;$$.as&lt;/code&gt; is a killer feature. «Mmm hmm, I do», — Biden answered.&lt;/p&gt;
&lt;p&gt;This is a double release notes for &lt;a href="https://github.com/selenide/selenide/milestone/118?closed=1"&gt;Selenide 5.20.0&lt;/a&gt; and
&lt;a href="https://github.com/selenide/selenide/milestone/119?closed=1"&gt;Selenide 5.20.1&lt;/a&gt;.&lt;/p&gt;
&lt;br&gt;
&lt;h1 id="we-added-operations-with-clipboard"&gt;We added operations with clipboard&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Selenide.clipboard().setText(&amp;quot;111&amp;quot;);&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;assertEquals(&amp;quot;Hello World&amp;quot;, Selenide.clipboard().getText());&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note that clipboard doesn&amp;rsquo;t work on Linux without graphical environment.&lt;/p&gt;
&lt;p&gt;Thanks to &lt;a href="https://github.com/dbudim"&gt;Dmitriy Budim&lt;/a&gt; for &lt;a href="https://github.com/selenide/selenide/pull/1409"&gt;PR 1409&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;NB!These methods are overridden in &lt;a href="https://github.com/selenide/selenide-selenoid"&gt;selenide-selenoid&lt;/a&gt; plugin to work correctly in Selenoid.
We also released version &lt;a href="https://github.com/selenide/selenide-selenoid/releases/tag/v1.1.0"&gt;1.1.0&lt;/a&gt; of the plugin.&lt;/p&gt;</description></item><item><title>Released Selenide 5.19.0</title><link>https://selenide.org/2021/02/24/selenide-5.19.0/</link><pubDate>Wed, 24 Feb 2021 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2021/02/24/selenide-5.19.0/</guid><description>&lt;p&gt;Good morning!&lt;/p&gt;
&lt;p&gt;You probably didn&amp;rsquo;t know, but today, February 24, is the main holiday in Estonia -
&lt;a href="https://en.wikipedia.org/wiki/Estonian_Declaration_of_Independence"&gt;Independence Day&lt;/a&gt;.
Exactly 103 years ago, Estonia was proclaimed an independent democratic republic.&lt;/p&gt;
&lt;p&gt;And 93 years later in Estonia, in the casemates of &lt;a href="https://codeborne.com/"&gt;Codeborne&lt;/a&gt; company,
Selenide library was born. Isn&amp;rsquo;t that a miracle?&lt;/p&gt;
&lt;p&gt;So we dedicate our new release &lt;a href="https://github.com/selenide/selenide/milestone/116?closed=1"&gt;Selenide 5.19.0&lt;/a&gt; to Independence Day.&lt;/p&gt;
&lt;br&gt;
&lt;h1 id="we-fixed-draganddrop-finally"&gt;We fixed drag&amp;rsquo;and&amp;rsquo;drop, finally!&lt;/h1&gt;
&lt;p&gt;Selenide has had method &lt;code&gt;$.dragAndDropTo()&lt;/code&gt; for years, but de-factor it doesn&amp;rsquo;t work. Under the hood it uses
Selenium mechanism &lt;code&gt;Actions&lt;/code&gt;, and something was broken in it. It just doesn&amp;rsquo;t drag the element.&lt;/p&gt;</description></item><item><title>Released Selenide 5.18.1</title><link>https://selenide.org/2021/02/11/selenide-5.18.1/</link><pubDate>Thu, 11 Feb 2021 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2021/02/11/selenide-5.18.1/</guid><description>&lt;p&gt;Hi all!&lt;/p&gt;
&lt;p&gt;We have release a small update &lt;a href="https://github.com/selenide/selenide/milestone/115?closed=1"&gt;Selenide 5.18.1&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s look at the changes:&lt;/p&gt;
&lt;br&gt;
&lt;h1 id="added-method-selenidegetsessionstorage"&gt;Added method &lt;code&gt;Selenide.getSessionStorage()&lt;/code&gt;&lt;/h1&gt;
&lt;p&gt;&amp;hellip; similar to &lt;code&gt;Selenide.getLocalStorage()&lt;/code&gt; added in 5.15.0.&lt;/p&gt;
&lt;p&gt;They both have the same set of methods: &lt;code&gt;getItem&lt;/code&gt;, &lt;code&gt;setItem&lt;/code&gt;, &lt;code&gt;removeItem&lt;/code&gt;, &lt;code&gt;clear&lt;/code&gt; etc.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Sometimes it&amp;rsquo;s useful to set some flag to &lt;code&gt;sessionStorage&lt;/code&gt; to &lt;code&gt;localStorage&lt;/code&gt; to emulate some user action or
toggle some features or settings.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Thanks to &lt;a href="https://github.com/dbudim"&gt;Dmitriy Budim&lt;/a&gt; for &lt;a href="https://github.com/selenide/selenide/pull/1400"&gt;PR 1400&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;P.S. FYI &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Window/sessionStorage"&gt;difference between localStorage and sessionStorage&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Released Selenide 5.18.0</title><link>https://selenide.org/2021/01/23/selenide-5.18.0/</link><pubDate>Sat, 23 Jan 2021 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2021/01/23/selenide-5.18.0/</guid><description>&lt;p&gt;Good evening!&lt;/p&gt;
&lt;p&gt;Today is January, 23.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s meet the new update: &lt;a href="https://github.com/selenide/selenide/milestone/113?closed=1"&gt;Selenide 5.18.0&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Let me invite you to take a small virtual tour of the changes in 5.18.0.&lt;br&gt;
Make yourself comfortable.&lt;/p&gt;
&lt;br&gt;
&lt;h1 id="we-disabled-webdriver-logs-by-default"&gt;We disabled webdriver logs by default&lt;/h1&gt;
&lt;p&gt;Starting from version 5.13.0, Selenide wrote webdriver logs to files &lt;code&gt;build/reports/tests/webdriver.uuid.log&lt;/code&gt;.&lt;br&gt;
It seemed to be useful at that moment. But later we realized that these logs take quite a lot of disk space,
and nobody really needs to read them in most cases. That&amp;rsquo;s why we decided to disable them by default.&lt;/p&gt;</description></item><item><title>Released Selenide 5.17.2</title><link>https://selenide.org/2020/12/30/selenide-5.17.2/</link><pubDate>Wed, 30 Dec 2020 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2020/12/30/selenide-5.17.2/</guid><description>&lt;p&gt;Good morning!&lt;/p&gt;
&lt;p&gt;The gnomes still cannot calm down. Tomorrow morning they will bring you the last present in your socks:
release &lt;a href="https://github.com/selenide/selenide/milestone/110?closed=1"&gt;Selenide 5.17.2&lt;/a&gt;.&lt;/p&gt;
&lt;br&gt;
&lt;h1 id="make-commands-return-selenideelement-instead-webelement"&gt;Make &lt;code&gt;Commands&lt;/code&gt; return &lt;code&gt;SelenideElement&lt;/code&gt; instead &lt;code&gt;WebElement&lt;/code&gt;&lt;/h1&gt;
&lt;p&gt;It allows you chaining &lt;code&gt;$.execute(Command)&lt;/code&gt; with other Selenide methods, thus making your tests even more concise
and expressive:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;.lupa&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ScrollToCenter&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="na"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;.pupa&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;click&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Thanks to &lt;a href="https://github.com/BorisOsipov"&gt;Boris Osipov&lt;/a&gt; for &lt;a href="https://github.com/selenide/selenide/pull/1355"&gt;PR 1355&lt;/a&gt;.&lt;/p&gt;
&lt;br/&gt;
&lt;h1 id="fixed-method-setvaluenull"&gt;Fixed method &lt;code&gt;$.setValue(null)&lt;/code&gt;&lt;/h1&gt;
&lt;p&gt;See &lt;a href="https://github.com/selenide/selenide/issues/1356"&gt;issue 1356&lt;/a&gt;.
Thanks to &lt;a href="https://github.com/dzem"&gt;Dmitriy Zemlyanitsyn&lt;/a&gt; for &lt;a href="https://github.com/selenide/selenide/pull/1357"&gt;PR 1357&lt;/a&gt;.&lt;/p&gt;
&lt;br/&gt;
&lt;h1 id="enabled-soft-asserts-in-beforeall-and-afterall-methods-in-junit-5"&gt;Enabled soft asserts in @BeforeAll and @AfterAll methods (in JUnit 5)&lt;/h1&gt;
&lt;p&gt;See &lt;a href="https://github.com/selenide/selenide/issues/981"&gt;issue 981&lt;/a&gt;,
&lt;a href="https://github.com/selenide/selenide/issues/1070"&gt;issue 1070&lt;/a&gt; and
&lt;a href="https://github.com/selenide/selenide/pull/1359"&gt;PR 1359&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Released 5.17.0</title><link>https://selenide.org/2020/12/26/selenide-5.17.0/</link><pubDate>Sat, 26 Dec 2020 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2020/12/26/selenide-5.17.0/</guid><description>&lt;p&gt;Good night!&lt;/p&gt;
&lt;p&gt;I am passionate about Catholic Christmas.
Because it was on Christmas that the terrorists took over the Nakatomi plaza and Bruce killed Hans Gruber.
And then he blew up the plane with a lighter.&lt;/p&gt;
&lt;p&gt;So catch the Christmas release &lt;a href="https://github.com/selenide/selenide/milestone/108?closed=1"&gt;Selenide 5.17.0&lt;/a&gt;.&lt;/p&gt;
&lt;br&gt;
&lt;h1 id="added-method-asname"&gt;Added method $.as(&amp;ldquo;name&amp;rdquo;)&lt;/h1&gt;
&lt;p&gt;We added method &lt;code&gt;as&lt;/code&gt;, so that you can give elements readable names.&lt;/p&gt;
&lt;p&gt;To feel the difference, let&amp;rsquo;s compare the following two lines in test:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;$&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="na"&gt;xpath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/long/ugly/xpath[1][2][3]&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="na"&gt;shouldNot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exist&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;$&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="na"&gt;xpath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/long/ugly/xpath[1][2][3]&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="na"&gt;as&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Login button&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;shouldNot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exist&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The test result looks like this:&lt;/p&gt;</description></item><item><title>Released Selenide 5.16.2</title><link>https://selenide.org/2020/11/25/selenide-5.16.2/</link><pubDate>Wed, 25 Nov 2020 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2020/11/25/selenide-5.16.2/</guid><description>&lt;p&gt;Good morning!&lt;/p&gt;
&lt;p&gt;We released &lt;a href="https://github.com/selenide/selenide/milestone/109?closed=1"&gt;Selenide 5.16.2&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Please don&amp;rsquo;t think that recent release &lt;a href="https://selenide.org/2020/11/20/selenide-5.16.0/"&gt;Selenide 5.16.0&lt;/a&gt; had a lot of bugs.&lt;br&gt;
Not at all.&lt;/p&gt;
&lt;p&gt;This release 5.16.2 is a bunch of fixes for old small issues.&lt;/p&gt;
&lt;p&gt;Briefly:&lt;/p&gt;
&lt;h2 id="selenide-5.16.2"&gt;Release &lt;a href="https://github.com/selenide/selenide/milestone/109?closed=1"&gt;5.16.2&lt;/a&gt; (25.11.2020)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/selenide/selenide/issues/1332"&gt;#1332&lt;/a&gt; return old click(int, int) command logic &amp;ndash; thanks to Petro Ovcharenko for PR &lt;a href="https://github.com/selenide/selenide/pull/1333"&gt;#1333&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;make SoftAssertsExtension thread-safe &amp;ndash; thanks to @dtuchs for PR &lt;a href="https://github.com/selenide/selenide/pull/1334"&gt;#1334&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/selenide/selenide/issues/1258"&gt;#1258&lt;/a&gt; fix soft asserts with ParameterizedTest in jUnit5 &amp;ndash; see PR &lt;a href="https://github.com/selenide/selenide/pull/1328"&gt;#1328&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/selenide/selenide/issues/1293"&gt;#1293&lt;/a&gt; don&amp;rsquo;t report &amp;ldquo;Element not found&amp;rdquo; in case of other errors &amp;ndash; see PR &lt;a href="https://github.com/selenide/selenide/pull/1326"&gt;#1326&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/selenide/selenide/issues/1290"&gt;#1290&lt;/a&gt; don&amp;rsquo;t show unused page object fields in report &amp;ndash; see PR &lt;a href="https://github.com/selenide/selenide/pull/1327"&gt;#1327&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;upgrade to littleproxy:2.0.1 &amp;ndash; see PR &lt;a href="https://github.com/selenide/selenide/pull/1325"&gt;#1325&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="selenide-5.16.1"&gt;Release &lt;a href="https://github.com/selenide/selenide/milestone/106?closed=1"&gt;5.16.1&lt;/a&gt; (23.11.2020)&lt;/h2&gt;
&lt;p&gt;Here we had two fixes to run Chrome with extensions.&lt;/p&gt;</description></item><item><title>Released Selenide 5.16.0</title><link>https://selenide.org/2020/11/20/selenide-5.16.0/</link><pubDate>Fri, 20 Nov 2020 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2020/11/20/selenide-5.16.0/</guid><description>&lt;p&gt;Good night!&lt;/p&gt;
&lt;p&gt;We released &lt;a href="https://github.com/selenide/selenide/milestone/105?closed=1"&gt;Selenide 5.16.0&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="plugin-system"&gt;Plugin system&lt;/h2&gt;
&lt;p&gt;One of the major plans for this year in &lt;a href="https://github.com/selenide/selenide/wiki/Selenide-Roadmap"&gt;Selenide roadmap&lt;/a&gt;
was to create a plugins system. It took time, but now&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;the day has come!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Currently there are two Selenide plugins available:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/selenide/selenide-appium"&gt;selenide-appium 1.5.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/selenide/selenide-selenoid"&gt;selenide-selenoid 1.0.0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We will describe them in following posts.&lt;/p&gt;
&lt;p&gt;Apparently, we are going to create next plugins for Allure, JUnit, TestNG, AShot.&lt;br&gt;
&lt;em&gt;Please share your ideas too!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;See &lt;a href="https://github.com/selenide/selenide/issues/1051"&gt;issue #1051&lt;/a&gt; and
&lt;a href="https://github.com/selenide/selenide/pull/1264"&gt;PR #1264&lt;/a&gt;,
&lt;a href="https://github.com/selenide/selenide/pull/1317"&gt;PR 1317&lt;/a&gt; and
&lt;a href="https://github.com/selenide/selenide/pull/1321"&gt;PR 1321&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Why proxy does not work in Selenoid?</title><link>https://selenide.org/2020/11/17/why-proxy-does-not-work-in-selenoid/</link><pubDate>Tue, 17 Nov 2020 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2020/11/17/why-proxy-does-not-work-in-selenoid/</guid><description>&lt;p&gt;Good night!&lt;/p&gt;
&lt;p&gt;Today we will finally reveal the secret of why proxy does not often work in Selenoid.&lt;/p&gt;
&lt;h3 id="the-goal-download-a-file"&gt;The goal: download a file&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;We run tests which open browsers in Selenoid containers (usually with Selenide, but it&amp;rsquo;s not important in this case).&lt;/li&gt;
&lt;li&gt;We want to download a file during the test.&lt;/li&gt;
&lt;li&gt;Default method &lt;code&gt;$.download()&lt;/code&gt; doesn&amp;rsquo;t work (for example, because the download starts by submitting a form - there is no direct link to the file).&lt;/li&gt;
&lt;li&gt;That&amp;rsquo;s why we want to &lt;a href="https://selenide.org/2019/12/10/advent-calendar-download-files/"&gt;download file via proxy&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="our-plan"&gt;Our plan&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Create a project&lt;/li&gt;
&lt;li&gt;Add BrowserUpProxy dependency as shown in Selenide documentation:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;dependencies&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;testRuntimeOnly&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;com.browserup:browserup-proxy-core:2.1.1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="3"&gt;
&lt;li&gt;Copy-paste a typical boilerplate to run browsers in Selenoid:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Configuration&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;proxyHost&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;192.168.0.10&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Configuration&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;remote&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;http://localhost:4444/wd/hub&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;DesiredCapabilities&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;capabilities&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DesiredCapabilities&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;capabilities&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setBrowserName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;chrome&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;capabilities&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setVersion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;85.0&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;capabilities&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setCapability&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;enableVNC&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;capabilities&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setCapability&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;enableVideo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;capabilities&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setCapability&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;enableLog&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Configuration&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;browserCapabilities&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;capabilities&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Configuration&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fileDownload&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;FileDownloadMode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;PROXY&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Configuration&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;proxyEnabled&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="4"&gt;
&lt;li&gt;And write a test, something like this:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://the-internet.herokuapp.com/download&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;byText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;some-file.txt&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="na"&gt;download&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;assertThat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getName&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="na"&gt;isEqualTo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;some-file.txt&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="the-problem"&gt;The problem&lt;/h3&gt;
&lt;p&gt;And we get an error when opening a browser:&lt;/p&gt;</description></item><item><title>Released Selenide 5.15.0</title><link>https://selenide.org/2020/09/26/selenide-5.15.0/</link><pubDate>Sat, 26 Sep 2020 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2020/09/26/selenide-5.15.0/</guid><description>&lt;p&gt;Hi all!&lt;/p&gt;
&lt;p&gt;We released &lt;a href="https://github.com/selenide/selenide/milestone/104?closed=1"&gt;Selenide 5.15.0&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;What&amp;rsquo;s new?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2020/09/26/selenide-5.15.0/#page-load-timeout"&gt;Setting &lt;code&gt;Configuration.pageLoadTimeout&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2020/09/26/selenide-5.15.0/#click-with-options"&gt;Click with options&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2020/09/26/selenide-5.15.0/#download-with-options"&gt;File download with options&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2020/09/26/selenide-5.15.0/#local-storage"&gt;Working with LocalStorage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2020/09/26/selenide-5.15.0/#own-text"&gt;Element text without descedants&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2020/09/26/selenide-5.15.0/#speed-up-collections"&gt;Speed up filtered collections&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2020/09/26/selenide-5.15.0/#href-checks"&gt;Checks for &amp;ldquo;href&amp;rdquo;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2020/09/26/selenide-5.15.0/#no-sandbox"&gt;Chrome option &amp;ldquo;&amp;ndash;no-sandbox&amp;rdquo;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2020/09/26/selenide-5.15.0/#news"&gt;News&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="page-load-timeout"&gt;We added setting &lt;code&gt;Configuration.pageLoadTimeout&lt;/code&gt; &lt;br/&gt; (default value is 30 seconds)&lt;/h2&gt;
&lt;p&gt;Sometimes your browser hands trying to load some heavy page, or a huge image or something else.&lt;br&gt;
You lose your time, your build lasts for a long; sessions get expired by timeout etc.&lt;/p&gt;</description></item><item><title>Released Selenide 5.14.0</title><link>https://selenide.org/2020/08/17/selenide-5.14.0/</link><pubDate>Mon, 17 Aug 2020 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2020/08/17/selenide-5.14.0/</guid><description>&lt;p&gt;Good night!&lt;/p&gt;
&lt;p&gt;We have released &lt;a href="https://github.com/selenide/selenide/milestone/101?closed=1"&gt;Selenide 5.14.0&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="stabilized-new-file-downloading-mode-folder"&gt;Stabilized new file downloading mode &lt;code&gt;FOLDER&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;&amp;hellip; which was introduced in &lt;a href="https://selenide.org/2020/07/08/selenide-5.13.0/"&gt;Selenide 5.13.0&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;What has been changed in 5.14.0:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Every time when Selenide opens a browser it creates a unique downloads folder for it.&lt;br&gt;
It helps to avoid situation when parallel tests are downloading multiple files to the same folder at the same time.
And it&amp;rsquo;s impossible to understand what file is downloaded by which test.&lt;/p&gt;</description></item><item><title>Released Selenide 5.13.0</title><link>https://selenide.org/2020/07/08/selenide-5.13.0/</link><pubDate>Wed, 08 Jul 2020 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2020/07/08/selenide-5.13.0/</guid><description>&lt;p&gt;Good morning!&lt;/p&gt;
&lt;p&gt;Good summer!&lt;/p&gt;
&lt;p&gt;We released &lt;a href="https://github.com/selenide/selenide/milestone/98?closed=1"&gt;Selenide 5.13.0&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Be prepared: it might break your tests (if they were not accurate).&lt;/p&gt;
&lt;div class="blogpost-menu"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#should-have-empty-text"&gt;Forbidden &lt;code&gt;shouldHave(text(""))&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#remove-unneeded-allure-logs"&gt;Removed unneeded Allure logs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#improve-collection-error-messages"&gt;Error messages for collections&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#fix-upload-without-form"&gt;Download files without &lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#download-files-with-quotes"&gt;Download files with quotes in name&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#write-webdriver-logs-to-file"&gt;Write webdriver logs to file&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#new-file-download-mode-folder"&gt;New downloading algorithm &lt;code&gt;FOLDER&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#get-wrapped-element-waits-for-element"&gt;Method &lt;code&gt;$.getWrappedElement()&lt;/code&gt; waits for the element&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#statistics"&gt;Statistics&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="should-have-empty-text"&gt;Method &lt;code&gt;$.shouldHave(text(&amp;quot;&amp;quot;))&lt;/code&gt; now throws an exception&lt;/h2&gt;
&lt;p&gt;Probably most popular Selenide method is &lt;code&gt;$.shouldHave(text(&amp;quot;something&amp;quot;))&lt;/code&gt;. But if you even use it daily, you might not
realize that it checks a &lt;em&gt;substring&lt;/em&gt;, not the whole text.&lt;/p&gt;</description></item><item><title>Released Selenide 5.12.2</title><link>https://selenide.org/2020/05/29/selenide-5.12.2/</link><pubDate>Fri, 29 May 2020 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2020/05/29/selenide-5.12.2/</guid><description>&lt;p&gt;Hi all!&lt;/p&gt;
&lt;p&gt;We have published one more mini-release &lt;a href="https://github.com/selenide/selenide/milestone/99?closed=1"&gt;Selenide 5.12.2&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="fixed-annotations-nonnull"&gt;Fixed annotations @Nonnull&lt;/h2&gt;
&lt;p&gt;&amp;hellip; for some of &lt;code&gt;SelenideElement&lt;/code&gt; methods.&lt;/p&gt;
&lt;p&gt;After upgrading to Selenide 5.12.0 some Kotlin users started getting compilation errors in their projects.&lt;br&gt;
It&amp;rsquo;s because we marked all methods of &lt;code&gt;SelenideElement&lt;/code&gt; with annotations &lt;code&gt;@Nullable&lt;/code&gt;/&lt;code&gt;@Nonnull&lt;/code&gt;, and Kotlin is sensible to them.&lt;/p&gt;
&lt;p&gt;For the following methods we now changed &lt;code&gt;@Nullable&lt;/code&gt; annotation to &lt;code&gt;@Nonnull&lt;/code&gt; (because they never return null):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;$.getText()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$.text()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$.innerText()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$.innerHtml()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$.getSelectedText()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now you can again put results of those methods to non-nullable variables (though such constructs seem to me a bit strange in tests).&lt;/p&gt;</description></item><item><title>Released Selenide 5.12.1</title><link>https://selenide.org/2020/05/25/selenide-5.12.1/</link><pubDate>Mon, 25 May 2020 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2020/05/25/selenide-5.12.1/</guid><description>&lt;p&gt;Good night!&lt;/p&gt;
&lt;p&gt;This is a quickfix release &lt;a href="https://github.com/selenide/selenide/milestone/97?closed=1"&gt;Selenide 5.12.1&lt;/a&gt;
with a couple of minor fixes for &lt;a href="https://selenide.org/2020/05/23/selenide-5.12.0/"&gt;Selenide 5.12.0&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="fixed-concurrent-modification-exception-during-webdriver-initialization"&gt;Fixed &lt;em&gt;Concurrent modification exception&lt;/em&gt; during webdriver initialization&lt;/h2&gt;
&lt;p&gt;See &lt;a href="https://github.com/selenide/selenide/issues/1170"&gt;issue 1170&lt;/a&gt; and &lt;a href="https://github.com/selenide/selenide/pull/1171"&gt;PR 1171&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="fixed-merging-of-excludeswitches-settings-of-different-types"&gt;Fixed merging of &amp;ldquo;excludeSwitches&amp;rdquo; settings of different types&lt;/h2&gt;
&lt;p&gt;It appeared that setting &lt;code&gt;excludeSwitches&lt;/code&gt; can have either Array or List type:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;chromeOptions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setExperimentalOption&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;excludeSwitches&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;enable-automation&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;load-extension&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;chromeOptions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setExperimentalOption&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;excludeSwitches&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;asList&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;enable-automation&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;load-extension&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Selenide 5.12.0 crashed if both of types were used. Now we fixed it.&lt;/p&gt;
&lt;p&gt;See &lt;a href="https://github.com/selenide/selenide/issues/1169"&gt;issue 1169&lt;/a&gt; and &lt;a href="https://github.com/selenide/selenide/pull/1174"&gt;PR 1174&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Released Selenide 5.12.0</title><link>https://selenide.org/2020/05/23/selenide-5.12.0/</link><pubDate>Sat, 23 May 2020 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2020/05/23/selenide-5.12.0/</guid><description>&lt;p&gt;Good day!&lt;/p&gt;
&lt;p&gt;Yes! We released &lt;a href="https://github.com/selenide/selenide/milestone/95?closed=1"&gt;Selenide 5.12.0&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Most of the changes are about browser capabilities.&lt;/p&gt;
&lt;h2 id="we-fixed-an-old-problem-with-configurationbrowsercapabilities"&gt;We fixed an old problem with &lt;code&gt;Configuration.browserCapabilities&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;People had been complaining for years about &lt;code&gt;ChromeOptions&lt;/code&gt;: some of these settings could be lost in some circumstances.&lt;br&gt;
It was caused by &lt;a href="https://github.com/SeleniumHQ/selenium/issues/5279"&gt;an old bug in Selenium webdriver&lt;/a&gt;, which seems to be lost and forgotten.&lt;/p&gt;
&lt;p&gt;But it seems that we have found a simple workaround for this problem.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If it helped you - please share you feedback.&lt;/li&gt;
&lt;li&gt;If it didn&amp;rsquo;t help - please register a github issue. We will work out another hack. :)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;See &lt;a href="https://github.com/selenide/selenide/issues/676"&gt;issue 676&lt;/a&gt;, &lt;a href="https://github.com/selenide/selenide/issues/1097"&gt;issue 1097&lt;/a&gt;
and &lt;a href="https://github.com/selenide/selenide/pull/1155"&gt;PR 1155&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Released Selenide 5.11.1</title><link>https://selenide.org/2020/04/21/selenide-5.11.1/</link><pubDate>Tue, 21 Apr 2020 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2020/04/21/selenide-5.11.1/</guid><description>&lt;p&gt;Good evening!&lt;/p&gt;
&lt;p&gt;It seems that &lt;a href="https://github.com/selenide/selenide/milestone/94?closed=1"&gt;Selenide 5.11.0&lt;/a&gt; still broke too many rules,
and we decided to slow down the horses.&lt;/p&gt;
&lt;p&gt;If you are affected, you can upgrade to &lt;a href="https://github.com/selenide/selenide/milestone/96?closed=1"&gt;Selenide 5.11.1&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="slf4j"&gt;SLF4J&lt;/h2&gt;
&lt;p&gt;Some folks didn&amp;rsquo;t like the fact that Selenide 5.11.0 requires a valid slf4j dependency. Folks don&amp;rsquo;t want to
bother with slf4j. Folks don&amp;rsquo;t want to read our logs. :)&lt;/p&gt;
&lt;p&gt;It was unexpected for us, but well, we found a compromise.&lt;/p&gt;
&lt;p&gt;Now Selenide doesn&amp;rsquo;t require slf4j always, but only when it&amp;rsquo;s needed for sure. Namely, when you use
&lt;a href="https://selenide.org/2016/09/26/selenide-3.10/"&gt;&lt;code&gt;TextReport&lt;/code&gt; feature&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Released Selenide 5.11.0</title><link>https://selenide.org/2020/04/19/selenide-5.11.0/</link><pubDate>Sun, 19 Apr 2020 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2020/04/19/selenide-5.11.0/</guid><description>&lt;p&gt;Good night!&lt;/p&gt;
&lt;p&gt;We have released &lt;a href="https://github.com/selenide/selenide/milestone/94?closed=1"&gt;Selenide 5.11.0&lt;/a&gt;.&lt;br&gt;
This is the second quarantine release of Selenide in which we made a couple of breaking changes.&lt;/p&gt;
&lt;h2 id="changed-the-behaviour-of-shouldnot-methods-for-unexisting-elements"&gt;Changed the behaviour of &lt;code&gt;shouldNot*&lt;/code&gt; methods for unexisting elements&lt;/h2&gt;
&lt;p&gt;Just look at the table below to understand what changed.&lt;br&gt;
Assuming element &lt;code&gt;h1&lt;/code&gt; &lt;strong&gt;does not exist&lt;/strong&gt; on a page:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Check&lt;/th&gt;
 &lt;th&gt;Selenide 5.10-&lt;/th&gt;
 &lt;th&gt;Selenide 5.11+&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;h1.shouldNot(exist)&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;ok&lt;/td&gt;
 &lt;td&gt;ok&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;h1.shouldNotBe(visible)&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;ok&lt;/td&gt;
 &lt;td&gt;ok&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;h1.shouldBe(hidden)&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;ok&lt;/td&gt;
 &lt;td&gt;ok&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;h1.shouldNotHave(text(&amp;quot;foo&amp;quot;))&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;ok&lt;/td&gt;
 &lt;td&gt;FAIL&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;h1.shouldNotHave(attribute(&amp;quot;bar&amp;quot;))&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;ok&lt;/td&gt;
 &lt;td&gt;FAIL&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;h1.find(&amp;quot;h2&amp;quot;).shouldNot(exist)&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;ok&lt;/td&gt;
 &lt;td&gt;ok&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;h1.find(&amp;quot;h2&amp;quot;).shouldNotHave(text(&amp;quot;foo&amp;quot;))&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;ok&lt;/td&gt;
 &lt;td&gt;FAIL&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;br/&gt;
&lt;h3 id="previous-logic"&gt;Previous logic&lt;/h3&gt;
&lt;p&gt;A long time ago it was decided in Selenide: the check &lt;code&gt;h1.shouldNotHave(text(&amp;quot;foo&amp;quot;))&lt;/code&gt; should not fail. If the element &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt;
does not exist, then it doesn&amp;rsquo;t have text &amp;ldquo;foo&amp;rdquo;. So, the condition &amp;ldquo;should not have text&amp;rdquo; is true.&lt;/p&gt;</description></item><item><title>Released Selenide 5.10.0</title><link>https://selenide.org/2020/03/18/selenide-5.10.0/</link><pubDate>Wed, 18 Mar 2020 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2020/03/18/selenide-5.10.0/</guid><description>&lt;p&gt;Good quarantine!&lt;/p&gt;
&lt;p&gt;It was the third day of quarantine.&lt;/p&gt;
&lt;p&gt;To make you feel not so lonely, we released &lt;a href="https://github.com/selenide/selenide/milestone/93?closed=1"&gt;Selenide 5.10.0&lt;/a&gt; with
a bunch of improvements. Some of them are even slightly backward incompatible. Well, so you do not get bored in your dens.&lt;/p&gt;
&lt;div class="blogpost-menu"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#add-shadow-dom-support"&gt;Added support for Shadow DOM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#exclude-bup-by-default"&gt;Don't fetch BrowserUpProxy by default&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#replace-guava"&gt;Replace Guava APIs by Java APIs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#add-quotes-to-report"&gt;Made Selenide Allure report nicer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#add-image-condition"&gt;Added condition shouldBe(image)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#video"&gt;Videos&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="add-shadow-dom-support"&gt;We added support for Shadow DOM&lt;/h2&gt;
&lt;p&gt;See examples &lt;a href="https://github.com/selenide/selenide/blob/master/src/test/java/integration/ShadowElementTest.java"&gt;in tests&lt;/a&gt;:&lt;/p&gt;</description></item><item><title>Released Selenide 5.9.0</title><link>https://selenide.org/2020/03/10/selenide-5.9.0/</link><pubDate>Tue, 10 Mar 2020 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2020/03/10/selenide-5.9.0/</guid><description>&lt;p&gt;Buenos Marchos!&lt;/p&gt;
&lt;p&gt;In Selenide, we strive to cure flaky tests all the time.&lt;/p&gt;
&lt;p&gt;Today we released &lt;a href="https://github.com/selenide/selenide/milestone/92?closed=1"&gt;Selenide 5.9.0&lt;/a&gt; with one feature that can help to overcome some of your flaky tests.&lt;/p&gt;
&lt;h2 id="we-added-a-filter-for-downloading-files-downloadfilefilter"&gt;We added a filter for downloading files: &lt;code&gt;$.download(FileFilter)&lt;/code&gt;&lt;/h2&gt;
&lt;h3 id="problem"&gt;Problem&lt;/h3&gt;
&lt;p&gt;When downloading files &lt;em&gt;via proxy&lt;/em&gt;, Selenide can sometimes download a wrong file. &lt;br&gt;
This is how it works: Selenide clicks the &amp;ldquo;download&amp;rdquo; button and intercepts all responses from server to browser.&lt;/p&gt;
&lt;p&gt;Exactly at this moment there could happen some unrelated requests between browser and server.&lt;br&gt;
Say, chrome decides to check for updates at this moment. Or your AUT sends request to google analytics. Or just some background requests.&lt;br&gt;
This creates fertile ground for emergence of &lt;em&gt;flaky tests&lt;/em&gt; which work on your machine but sometimes fail on jenkins.&lt;/p&gt;</description></item><item><title>Released Selenide 5.8.0</title><link>https://selenide.org/2020/02/28/selenide-5.8.0/</link><pubDate>Fri, 28 Feb 2020 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2020/02/28/selenide-5.8.0/</guid><description>&lt;p&gt;Buenos noches!&lt;/p&gt;
&lt;p&gt;We have merged next pack of pull requests and released &lt;a href="https://github.com/selenide/selenide/milestone/90?closed=1"&gt;Selenide 5.8.0&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;What updates will you see there?&lt;/p&gt;
&lt;h2 id="simplified-creation-of-custom-conditions-using-lambdas"&gt;Simplified creation of custom conditions using lambdas&lt;/h2&gt;
&lt;p&gt;In class &lt;code&gt;Condition&lt;/code&gt; there is a new method &lt;code&gt;match&lt;/code&gt; which allows you to create custom conditions without need to subclass &lt;code&gt;Condition&lt;/code&gt;.
You just need to pass it a lambda.&lt;/p&gt;
&lt;p&gt;See examples &lt;a href="https://github.com/selenide/selenide/blob/master/src/test/java/integration/ConditionsTest.java"&gt;in tests&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;#multirowTable&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;should&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;border=1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;el&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;border&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We also added similar methods for collections &lt;code&gt;anyMatch&lt;/code&gt;, &lt;code&gt;allMatch&lt;/code&gt; and &lt;code&gt;noneMatch&lt;/code&gt;.
See examples &lt;a href="https://github.com/selenide/selenide/blob/master/src/test/java/integration/CollectionMethodsTest.java"&gt;in tests&lt;/a&gt;:&lt;/p&gt;</description></item><item><title>Released Selenide 5.7.0</title><link>https://selenide.org/2020/02/07/selenide-5.7.0/</link><pubDate>Fri, 07 Feb 2020 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2020/02/07/selenide-5.7.0/</guid><description>&lt;p&gt;Buchahos!&lt;/p&gt;
&lt;p&gt;Recently we got a lot of pull requests with lot of useful changes. This is the power of open source!&lt;/p&gt;
&lt;p&gt;We have merged all those changes and released &lt;a href="https://github.com/selenide/selenide/milestone/89?closed=1"&gt;Selenide 5.7.0&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="added-setting-configurationdownloadsfolder"&gt;Added setting &lt;code&gt;Configuration.downloadsFolder&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Before now, Selenide downloaded files to folder &lt;code&gt;build/reports&lt;/code&gt; - the same folder which contains generated test reports. &lt;br&gt;
But sometimes people want to have reports and screenshots in separate folders.&lt;br&gt;
For those people we added a dedicated setting &lt;code&gt;Configuration.downloadsFolder&lt;/code&gt; - now Selenide will download files there.&lt;/p&gt;</description></item><item><title>Released Selenide 5.6.1</title><link>https://selenide.org/2020/01/14/selenide-5.6.1/</link><pubDate>Tue, 14 Jan 2020 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2020/01/14/selenide-5.6.1/</guid><description>&lt;p&gt;Happy New Year for everyone!&lt;/p&gt;
&lt;p&gt;New year - new release. Please welcome &lt;a href="https://github.com/selenide/selenide/milestone/88?closed=1"&gt;Selenide 5.6.1&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id="added-method-selenideexecuteasyncscript"&gt;Added method &lt;code&gt;Selenide.executeAsyncScript()&lt;/code&gt;&lt;/h1&gt;
&lt;p&gt;I guess all of you have used method &lt;code&gt;Selenide.executeJavaScript()&lt;/code&gt;.
JavaScript gives us &lt;a href="https://selenide.org/2019/12/24/advent-calendar-javascript-tricks/"&gt;a big power&lt;/a&gt; in test automation.&lt;/p&gt;
&lt;p&gt;Now we added a method &lt;code&gt;Selenide.executeAsyncScript()&lt;/code&gt;. It can be used for executing asynchronous functions (like &lt;code&gt;setTimeout&lt;/code&gt;, &lt;code&gt;$.get&lt;/code&gt; etc.)&lt;/p&gt;
&lt;p&gt;Please note that it&amp;rsquo;s a little bit harder to use than &lt;code&gt;executeJavaScript()&lt;/code&gt;.&lt;br&gt;
After calling asynchronous JS methods need to execute &lt;code&gt;callback&lt;/code&gt; with a return value. You have to get &lt;code&gt;callback&lt;/code&gt; from a &lt;em&gt;last argument&lt;/em&gt;:&lt;/p&gt;</description></item><item><title>Released Selenide 5.6.0</title><link>https://selenide.org/2019/12/26/selenide-5.6.0/</link><pubDate>Thu, 26 Dec 2019 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2019/12/26/selenide-5.6.0/</guid><description>&lt;p&gt;Good morning!&lt;/p&gt;
&lt;p&gt;In the end of the year, we released &lt;a href="https://github.com/selenide/selenide/milestone/87?closed=1"&gt;Selenide 5.6.0&lt;/a&gt; with one significant change.&lt;/p&gt;
&lt;p&gt;We replaced (outdated) &lt;code&gt;BrowserMobProxy&lt;/code&gt; by its fork &lt;code&gt;BrowserUpProxy&lt;/code&gt; (current version 2.0.1).&lt;/p&gt;
&lt;p&gt;See &lt;a href="https://github.com/selenide/selenide/issues/1019"&gt;issue 1019&lt;/a&gt;.&lt;br&gt;
Thanks to &lt;a href="https://github.com/rosolko"&gt;Aliaksandr Rasolka&lt;/a&gt; for &lt;a href="https://github.com/selenide/selenide/pull/1020"&gt;PR 1020&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="what-good-is-there-is-browserupproxy"&gt;What good is there is &lt;code&gt;BrowserUpProxy&lt;/code&gt;?&lt;/h2&gt;
&lt;p&gt;It&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;supports Brotli Compression (in addition to gzip)&lt;/li&gt;
&lt;li&gt;supports HTTP/2&lt;/li&gt;
&lt;li&gt;based on actively maintained fork &lt;a href="https://github.com/mrog/LittleProxy"&gt;LittleProxy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;uses a better &lt;a href="https://github.com/sdstoehr/har-reader"&gt;HAR reader&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;can filter HAR entries&lt;/li&gt;
&lt;li&gt;supports versioned headers for JSON like &lt;code&gt;Content-Type=application/something-v1+json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;has built-in asserts for network and pages&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here is the &lt;a href="https://github.com/browserup/browserup-proxy/blob/master/CHANGELOG.md"&gt;full changelog&lt;/a&gt; of &lt;code&gt;BrowserUpProxy&lt;/code&gt; (compared to BrowserMobProxy).&lt;/p&gt;</description></item><item><title>JavaScript tricks</title><link>https://selenide.org/2019/12/24/advent-calendar-javascript-tricks/</link><pubDate>Tue, 24 Dec 2019 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2019/12/24/advent-calendar-javascript-tricks/</guid><description>&lt;p&gt;Good Christmas!&lt;/p&gt;
&lt;p&gt;Today is December, 24. It&amp;rsquo;s Christmas. It&amp;rsquo;s the last day of our Selenide Advent Calendar.&lt;/p&gt;
&lt;p&gt;In this last day, we will play JavaScript.&lt;/p&gt;
&lt;p&gt;As a language, JavaScript is a disaster, but it gives a big power when used in automated tests.&lt;br&gt;
It allows you doing things that are impossible with pure WebDriver.&lt;/p&gt;
&lt;p&gt;Let me show few examples from real projects.&lt;/p&gt;
&lt;h2 id="pick-a-date"&gt;Pick a date&lt;/h2&gt;
&lt;p&gt;There is a lot of different &amp;ldquo;date pickers&amp;rdquo; out there. It&amp;rsquo;s always a headache to pick a date using them.&lt;/p&gt;</description></item><item><title>Defaŭlta lingvo</title><link>https://selenide.org/2019/12/22/advent-calendar-defaulta-lingvo/</link><pubDate>Sun, 22 Dec 2019 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2019/12/22/advent-calendar-defaulta-lingvo/</guid><description>&lt;h1 id="defaŭlta-lingvo"&gt;Defaŭlta lingvo&lt;/h1&gt;
&lt;p&gt;The name of today&amp;rsquo;s topic is Esperanto and translates as &amp;ldquo;default language&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;You may have noticed that some web applications or sites change their language depending on either your browser language setting or on your location.&lt;/p&gt;
&lt;h2 id="problem"&gt;Problem&lt;/h2&gt;
&lt;p&gt;In case you have international developers in your team all writing and running some tests on different computer, you also may have noticed that the very same tests is failing or passing because the applications was displayed in different languages on different machines.&lt;/p&gt;</description></item><item><title>Big “wait” theory</title><link>https://selenide.org/2019/12/20/advent-calendar-big-wait-theory/</link><pubDate>Fri, 20 Dec 2019 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2019/12/20/advent-calendar-big-wait-theory/</guid><description>&lt;h1 id="big-wait-theory"&gt;Big &amp;ldquo;wait&amp;rdquo; theory&lt;/h1&gt;
&lt;p&gt;The topic of &amp;ldquo;wait&amp;rdquo; mechanism is well-known and sometimes can be controversial.&lt;br&gt;
The fact is that modern websites are problematic to be tested by test automation frameworks and generate many situations
where standard Selenium methods are ineffective. If you have read Selenide documentation, you already know that classic explicit waits like:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;element&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &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="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;timeOutForElement&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;until&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ExpectedConditions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;presenceOfElementLocated&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="na"&gt;cssSelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;cssSelector&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;or&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;element&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &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="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;timeOutForElement&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;until&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ExpectedConditions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;visibilityOfElementLocated&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="na"&gt;cssSelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;cssSelector&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;have been replaced by Selenide with (way shorter) variants:&lt;/p&gt;</description></item><item><title>How to get network data with proxy</title><link>https://selenide.org/2019/12/18/advent-calendar-network-logs-with-proxy/</link><pubDate>Wed, 18 Dec 2019 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2019/12/18/advent-calendar-network-logs-with-proxy/</guid><description>&lt;p&gt;Good night!&lt;/p&gt;
&lt;p&gt;In two previous posts of our Selenide Advent Calendar, we tried to find a way to read requests/responses between browser and server. &lt;br&gt;
They both were not ideal because they cannot read BODY of requests and responses.&lt;/p&gt;
&lt;p&gt;Finally, we try a third way - using a Selenide built-in proxy server.&lt;/p&gt;
&lt;h3 id="before-test"&gt;Before test&lt;/h3&gt;
&lt;p&gt;As you know, Selenide already has built-in proxy server. You only need to enable it:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Configuration&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;proxyEnabled&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now you need to say the proxy to start tracking requests:&lt;/p&gt;</description></item><item><title>How to get network data with JavaScript</title><link>https://selenide.org/2019/12/17/advent-calendar-browser-logs-with-js/</link><pubDate>Tue, 17 Dec 2019 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2019/12/17/advent-calendar-browser-logs-with-js/</guid><description>&lt;p&gt;Good night!&lt;/p&gt;
&lt;p&gt;In the yesterday post, we tried to get browser logs with &amp;ldquo;goog:loggingPrefs&amp;rdquo; capability.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;UPD: Later we added a method that works in both Firefox and Chromium browsers:
&lt;a href="https://selenide.org/2025/10/29/selenide-7.12.0/#browser-logs-with-bidi"&gt;Collecting browser logs using DevTools/BiDi&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;br&gt;
&lt;br&gt;
&lt;p&gt;Now we will try to get browser network data with JavaScript.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s simple. We just need to call this JavaScript in the end of test:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;js&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;var performance = window.performance || window.mozPerformance&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34; || window.msPerformance || window.webkitPerformance || {};&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34; return performance.getEntries() || {};&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;netData&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;executeJavaScript&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;js&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Network traffic: {}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;netData&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The result looks like this:&lt;/p&gt;</description></item><item><title>How to get browser logs</title><link>https://selenide.org/2019/12/16/advent-calendar-browser-logs/</link><pubDate>Mon, 16 Dec 2019 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2019/12/16/advent-calendar-browser-logs/</guid><description>&lt;p&gt;Good evening!&lt;/p&gt;
&lt;p&gt;We continue our Selenide Advent Calendar.&lt;br&gt;
Today we will try to look into browser &amp;ldquo;developer tools&amp;rdquo;.&lt;br&gt;
It may be useful if you want to know what errors happened during test run, or what requests your AUT sent.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;UPD: Later we added a method that works in both Firefox and Chromium browsers:
&lt;a href="https://selenide.org/2025/10/29/selenide-7.12.0/#browser-logs-with-bidi"&gt;Collecting browser logs using DevTools/BiDi&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;br&gt;
&lt;br&gt;
&lt;p&gt;Chromedriver suggests the following receipt.&lt;/p&gt;
&lt;h3 id="1-add-a-couple-of-lines-before-opening-a-browser"&gt;1. Add a couple of lines before opening a browser:&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;LoggingPreferences&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;logPrefs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;LoggingPreferences&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;logPrefs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;enable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LogType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;BROWSER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Level&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ALL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;logPrefs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;enable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LogType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;PERFORMANCE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Level&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ALL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;capabilities&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setCapability&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;goog:loggingPrefs&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;logPrefs&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This capability was named &amp;ldquo;loggingPrefs&amp;rdquo; until some version of Chrome, and then was renamed to &amp;ldquo;goog:loggingPrefs&amp;rdquo;.&lt;br&gt;
Not sure about other browsers.&lt;/p&gt;</description></item><item><title>Drag and Drop</title><link>https://selenide.org/2019/12/15/advent-calendar-drag-and-drop/</link><pubDate>Sun, 15 Dec 2019 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2019/12/15/advent-calendar-drag-and-drop/</guid><description>&lt;p&gt;Hi all!&lt;/p&gt;
&lt;p&gt;Today is 15th day of our Selenide Advent Calendar.&lt;/p&gt;
&lt;p&gt;Today we will watch a short funny video demonstrating how to drag-and-drop elements in Selenide.&lt;/p&gt;
&lt;h3 id="selenide-can-drag-and-drop-web-elements"&gt;Selenide can drag-and-drop web elements?&lt;/h3&gt;
&lt;p&gt;Yes, Selenide has method Drag&amp;rsquo;n&amp;rsquo;Drop. This is a boring description from Selenide blog:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;#from&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;dragAndDropTo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;#to&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And this is a funny demonstration by Martin Škarbala:&lt;/p&gt;
&lt;iframe width="800" height="490" src="https://www.youtube.com/embed/OSnwiosrMq0" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;That&amp;rsquo;s marvellous!&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;&lt;a href="http://asolntsev.github.io/"&gt;Andrei Solntsev&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;selenide.org&lt;/p&gt;</description></item><item><title>Actions</title><link>https://selenide.org/2019/12/12/advent-calendar-actions/</link><pubDate>Thu, 12 Dec 2019 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2019/12/12/advent-calendar-actions/</guid><description>&lt;p&gt;Hi!&lt;/p&gt;
&lt;p&gt;In today’s advent calendar article we will check how to perform special operations in Selenide.&lt;/p&gt;
&lt;p&gt;Sometimes in our tests we encounter weird problems.
It is 100% sure that all of us have experienced, or will experience some unusual problem that will make our work blocked.
It happens quite often that for example we cannot click some element on the page, and standard selenium/selenide command like:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;click&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;does not work. There can be many different reasons that will make our click operation ineffective but we cannot give up
just like that, and we have to find some solution. In this case, in Selenium we had &lt;code&gt;Actions&lt;/code&gt; class that helped us performing click operation in a bit different way:&lt;/p&gt;</description></item><item><title>How to download a file with Selenide</title><link>https://selenide.org/2019/12/10/advent-calendar-download-files/</link><pubDate>Tue, 10 Dec 2019 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2019/12/10/advent-calendar-download-files/</guid><description>&lt;p&gt;Good evening!&lt;br&gt;
Today is December - and in this Selenide Advent calendar article we will take a look at the file download options in Selenide.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPD&lt;/strong&gt;&lt;br&gt;
This article describes only 2 methods for downloading a file: &lt;a href="https://selenide.org/2019/12/10/advent-calendar-download-files/#HTTPGET"&gt;&lt;code&gt;HTTPGET&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://selenide.org/2019/12/10/advent-calendar-download-files/#PROXY"&gt;&lt;code&gt;PROXY&lt;/code&gt;&lt;/a&gt;.
Later we added &lt;a href="https://selenide.org/2020/07/08/selenide-5.13.0/#new-file-download-mode-folder"&gt;the third method &lt;code&gt;FOLDER&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://selenide.org/2024/02/07/selenide-7.1.0/#download-files-with-cdp"&gt;the fourth method &lt;code&gt;CDP&lt;/code&gt;&lt;/a&gt;.
Probably you need one of these methods - if your link doesn&amp;rsquo;t have &lt;code&gt;href&lt;/code&gt; attribute, and you cannot enable proxy for some reason.&lt;/p&gt;</description></item><item><title>Why we banned statics and then allowed again?</title><link>https://selenide.org/2019/12/09/advent-calendar-statics/</link><pubDate>Mon, 09 Dec 2019 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2019/12/09/advent-calendar-statics/</guid><description>&lt;p&gt;Good evening!&lt;/p&gt;
&lt;p&gt;Here is the 9th day of Selenide Advent Calendar, and&lt;br&gt;
I’ll tell you what excites the public most of all.&lt;/p&gt;
&lt;h1 id="why-statics-were-banned-in-selenide-500-but-allowed-again-in-540"&gt;Why statics were banned in Selenide 5.0.0, but allowed again in 5.4.0?&lt;/h1&gt;
&lt;p&gt;Short answer: we banned them occasionally. But it was good.&lt;/p&gt;
&lt;p&gt;Let me explain it in detail :)&lt;/p&gt;
&lt;h3 id="how-selenide-holds-webdrivers"&gt;How Selenide holds WebDrivers&lt;/h3&gt;
&lt;p&gt;Selenide stores webdriver instances in ThreadLocal.&lt;br&gt;
It allows you to run tests in parallel: different threads get different webdrivers. The code looks like this:&lt;/p&gt;</description></item><item><title>How to test CSRF protection</title><link>https://selenide.org/2019/12/07/advent-calendar-csrf-protection/</link><pubDate>Sat, 07 Dec 2019 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2019/12/07/advent-calendar-csrf-protection/</guid><description>&lt;p&gt;Hi all!&lt;/p&gt;
&lt;p&gt;Today is 7th day of our Selenide Advent Calendar. &lt;br&gt;
Today we will talk about testing security.&lt;/p&gt;
&lt;h1 id="what-is-csrf"&gt;What is CSRF?&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://www.owasp.org/index.php/Cross-Site_Request_Forgery_%28CSRF%29"&gt;CSRF&lt;/a&gt; is one of the most popular security attacks (Cross-Site Request Forgery).&lt;/p&gt;
&lt;p&gt;To protect itself from CSRF attack, a web-application should add a special parameter to (almost) every POST request.
Typically it&amp;rsquo;s called &lt;code&gt;authenticityToken&lt;/code&gt; (though the name may vary).&lt;/p&gt;
&lt;p&gt;A typical mistake is when web-application either doesn&amp;rsquo;t send &lt;code&gt;authenticityToken&lt;/code&gt; to server with some POST request or
doesn&amp;rsquo;t check it on server side.&lt;/p&gt;</description></item><item><title>How to visualize click</title><link>https://selenide.org/2019/12/06/advent-calendar-visualize-click/</link><pubDate>Fri, 06 Dec 2019 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2019/12/06/advent-calendar-visualize-click/</guid><description>&lt;p&gt;Good evening!&lt;/p&gt;
&lt;p&gt;Today is December 6th, you are reading the Selenide Advent calendar, and in today&amp;rsquo;s post I will show one simple
technique how to catch some flaky tests.&lt;/p&gt;
&lt;h1 id="whats-wring-with-clicks"&gt;What&amp;rsquo;s wring with clicks?&lt;/h1&gt;
&lt;p&gt;It&amp;rsquo;s an eternal problem: flaky tests.
One of typical reasons of flaky tests: click doesn&amp;rsquo;t work.&lt;/p&gt;
&lt;p&gt;As i described &lt;a href="https://www.youtube.com/watch?v=ibx8nVvt-Js"&gt;in this video&lt;/a&gt; on DelEx 2019 conference (sorry, the video is in Russian),
click in selenium often doesn&amp;rsquo;t work if the element was moving or resizing at that moment. Or if it was covered by other element
that suddenly appeared and got the click.&lt;/p&gt;</description></item><item><title>How to check size effectively?</title><link>https://selenide.org/2019/12/04/advent-calendar-effective-size-check/</link><pubDate>Wed, 04 Dec 2019 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2019/12/04/advent-calendar-effective-size-check/</guid><description>&lt;p&gt;Hello!&lt;/p&gt;
&lt;p&gt;Today is December 4th, it&amp;rsquo;s the Selenide Advent calendar, and in today&amp;rsquo;s post I will show how to check a collection size effectively.&lt;/p&gt;
&lt;h1 id="how-to-effectively-check-a-collection-size"&gt;How to effectively check a collection size?&lt;/h1&gt;
&lt;p&gt;Selenide has convenient methods for checking collections. For example, this is how you can check that a book list contains exactly 3 books:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;$$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;#books .book&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;shouldHave&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;3&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If this page implemented so that it contains much more books, and only some of them are visible, then you can filter the collection:&lt;/p&gt;</description></item><item><title>setWebDriver or WebDriverProvider?</title><link>https://selenide.org/2019/12/03/advent-calendar-set-webdriver-vs-webdriver-provider/</link><pubDate>Tue, 03 Dec 2019 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2019/12/03/advent-calendar-set-webdriver-vs-webdriver-provider/</guid><description>&lt;p&gt;Good evening!&lt;/p&gt;
&lt;p&gt;Today is December 3rd, you are reading the Selenide Advent calendar, and in today&amp;rsquo;s post I will answer one simple question.&lt;/p&gt;
&lt;h1 id="which-one-should-i-choose-setwebdriver-or-webdriverprovider"&gt;Which one should I choose, &lt;code&gt;setWebDriver()&lt;/code&gt; or &lt;code&gt;WebDriverProvider&lt;/code&gt;?&lt;/h1&gt;
&lt;p&gt;As you know, Selenide opens a browser automatically and closes it at the right moment. You don&amp;rsquo;t need to care about the browser.&lt;/p&gt;
&lt;p&gt;But sometimes you want to open a &amp;ldquo;custom&amp;rdquo; browser with some specific settings.
Selenide has 2 methods for this.
It happened so that I never wrote anywhere how to choose one of them.&lt;/p&gt;</description></item><item><title>How to abuse Selenide</title><link>https://selenide.org/2019/12/02/advent-calendar-how-to-abuse-selenide/</link><pubDate>Mon, 02 Dec 2019 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2019/12/02/advent-calendar-how-to-abuse-selenide/</guid><description>&lt;p&gt;Good year!&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s December, 02, and we continue with our Selenide Advent Calendar. This time will talk about invalid use of Selenide.&lt;/p&gt;
&lt;h1 id="how-to-abuse-selenide"&gt;How to abuse Selenide&lt;/h1&gt;
&lt;p&gt;I often hear people complaining that the following code doesn&amp;rsquo;t catch the exception:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;.banner&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;shouldBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;visible&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;.banner .close&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;click&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Exception&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// System.out.println(&amp;#34;The element is not found - a banner hasn&amp;#39;t appeared this time.&amp;#34;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The intention of this test is to check if a banner appeared. Not immediately, but wait for the banner a little bit: probably it will appear after some time.
If the banner has appeared, the test needs to close it.&lt;/p&gt;</description></item><item><title>The Main Algorithm</title><link>https://selenide.org/2019/12/01/advent-calendar-main-algorithm/</link><pubDate>Sun, 01 Dec 2019 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2019/12/01/advent-calendar-main-algorithm/</guid><description>&lt;p&gt;Good December!&lt;/p&gt;
&lt;p&gt;The Advent has begun.&lt;/p&gt;
&lt;p&gt;Children are unpacking their advent calendars, opening one small window with a chocolate every day.
In Java world, we have a &lt;a href="https://www.javaadvent.com/"&gt;Java Advent Calendar&lt;/a&gt;, in which many authors write a new article every day.
I also participated in it could of times (&lt;a href="https://www.javaadvent.com/2017/12/flaky-tests.html"&gt;2017&lt;/a&gt; and
&lt;a href="https://www.javaadvent.com/2018/12/wtf-connection-pools.html"&gt;2018&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;I also decided to start Selenide Advent Calendar. Every new day a new post. From 1st to 25th December.
I am starting, and you can continue - just give me a notice by any possible way.&lt;/p&gt;</description></item><item><title>Released Selenide 5.5.1</title><link>https://selenide.org/2019/11/29/selenide-5.5.1/</link><pubDate>Fri, 29 Nov 2019 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2019/11/29/selenide-5.5.1/</guid><description>&lt;p&gt;Hi all!&lt;/p&gt;
&lt;p&gt;At Black Friday, we released &lt;a href="https://github.com/selenide/selenide/milestone/86?closed=1"&gt;Selenide 5.5.1&lt;/a&gt; with a couple of new features.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2019/11/29/selenide-5.5.1/#mobile-browser-emulation"&gt;Mobile browser emulation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2019/11/29/selenide-5.5.1/#deprecated-selenide-close"&gt;Deprecated method &lt;code&gt;Selenide.close()&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2019/11/29/selenide-5.5.1/#news"&gt;News&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br/&gt; 
&lt;h1 id="mobile-browser-emulation"&gt;We added mobile browser emulation&lt;/h1&gt;
&lt;p&gt;Sometimes you want to run browser not on a usual Chrome, but on Chrome &amp;ldquo;like in mobile&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Like you would open a browser in mobile phone or tablet.&lt;/p&gt;
&lt;p&gt;(For example, site selenide.org looks ugly on mobile. :( We are working on it.)&lt;/p&gt;
&lt;p&gt;Now it&amp;rsquo;s easy to do it by adding a System property before running tests:&lt;/p&gt;</description></item><item><title>Released Selenide 5.5.0</title><link>https://selenide.org/2019/10/31/selenide-5.5.0/</link><pubDate>Thu, 31 Oct 2019 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2019/10/31/selenide-5.5.0/</guid><description>&lt;p&gt;Good evening!&lt;/p&gt;
&lt;p&gt;How do you celebrate Halloween?&lt;/p&gt;
&lt;p&gt;We released &lt;a href="https://github.com/selenide/selenide/milestone/85?closed=1"&gt;Selenide 5.5.0&lt;/a&gt; with some &lt;em&gt;backward incompatible changes&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;ARE YOU SCARED?&lt;/p&gt;
&lt;br/&gt; 
&lt;h1 id="migrated-from-jul-to-slf4j"&gt;Migrated from JUL to SLF4J&lt;/h1&gt;
&lt;p&gt;Sometimes Selenide needs to write down some diagnostic logs, like &amp;ldquo;I found browser binary in foo&amp;rdquo;, &amp;ldquo;I failed to save screenshot to bar&amp;rdquo; etc.&lt;/p&gt;
&lt;p&gt;Until now, Selenide did write its logs using Java built-in mechanism &lt;code&gt;java.util.logging&lt;/code&gt; (aka JUL).
It has some known disadvantages, that&amp;rsquo;s why there is plenty of alternatives in the Java world: Log4J, Slf4j, Logback, JCL.&lt;/p&gt;</description></item><item><title>Released Selenide 5.4.1</title><link>https://selenide.org/2019/10/16/selenide-5.4.0/</link><pubDate>Wed, 16 Oct 2019 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2019/10/16/selenide-5.4.0/</guid><description>&lt;p&gt;Good evening!&lt;/p&gt;
&lt;p&gt;There is nothing in the World more boring than October. Let&amp;rsquo;s brighten it up with bright news!&lt;/p&gt;
&lt;p&gt;Today we released Selenide 5.4.0 with a couple of noticeable changes &lt;em&gt;which many of you have been asking for a while&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPD&lt;/strong&gt; There was a bug in 5.4.0, so please upgrade to &lt;strong&gt;5.4.1&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPD 2&lt;/strong&gt; There is also a minor bug in 5.4.1: &lt;code&gt;Configuration.holdBrowserOpen&lt;/code&gt; doesn&amp;rsquo;t work. Will fix it in next version. I hope you don&amp;rsquo;t use it often.&lt;/p&gt;</description></item><item><title>Released Selenide 5.3.1</title><link>https://selenide.org/2019/09/07/selenide-5.3.1/</link><pubDate>Sat, 07 Sep 2019 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2019/09/07/selenide-5.3.1/</guid><description>&lt;p&gt;Hi all!&lt;/p&gt;
&lt;p&gt;There was a sensation:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The presentation of the new iPhone went unnoticed!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Because we released Selenide 5.3.1. With improved shots as well. :)&lt;/p&gt;
&lt;p&gt;We fixed only one problem in this version, but what problem is it!&lt;/p&gt;
&lt;br/&gt;
&lt;h1 id="maven-where-are-my-screenshots"&gt;Maven, where are my screenshots?&lt;/h1&gt;
&lt;p&gt;Recently we discovered that users of Maven and latest &lt;code&gt;maven-surefire-plugin:2.22.2&lt;/code&gt; were deprived of one of the most important selenide features:
screenshot was not added to the error report.&lt;/p&gt;</description></item><item><title>Released Selenide 5.3.0</title><link>https://selenide.org/2019/09/02/selenide-5.3.0/</link><pubDate>Mon, 02 Sep 2019 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2019/09/02/selenide-5.3.0/</guid><description>&lt;p&gt;We released Selenide 5.3.0. What&amp;rsquo;s new?&lt;/p&gt;
&lt;br/&gt;
&lt;h1 id="968-execute-custom-commands"&gt;#968 Execute custom commands&lt;/h1&gt;
&lt;p&gt;You will like this feature!&lt;/p&gt;
&lt;p&gt;I believe your code is fill of custom methods for operating web elements. You use some tricky double click,
select some non-standard radio button on ReactJS, pick a date from hipster datepicker and upload a file from hidden input.&lt;/p&gt;
&lt;p&gt;Now we added a convenient way to execute such commands in one line. You just need to call method &lt;code&gt;$.execute&lt;/code&gt;:&lt;/p&gt;</description></item><item><title>Released Selenide 5.2.7</title><link>https://selenide.org/2019/08/01/selenide-5.2.7/</link><pubDate>Thu, 01 Aug 2019 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2019/08/01/selenide-5.2.7/</guid><description>&lt;p&gt;Good summer everyone!&lt;/p&gt;
&lt;p&gt;We recently released several minor Selenide updates: 5.2.5-5.2.7.&lt;/p&gt;
&lt;p&gt;Let me speak from my heart why we needed them.&lt;/p&gt;
&lt;br/&gt;
&lt;h1 id="we-fixed-error-messages-when-running-selenideappium"&gt;We fixed error messages when running Selenide+Appium&lt;/h1&gt;
&lt;p&gt;Appium is a webdriver for mobile applications (&lt;code&gt;AndroidDriver&lt;/code&gt;, &lt;code&gt;IOSDriver&lt;/code&gt;).
At a first glance, it seems to be a great idea: use the well-known Selenium WebDriver protocol for testing mobile.
But many things that were &amp;ldquo;standard&amp;rdquo; and &amp;ldquo;reasonable&amp;rdquo; in web, work differently in mobile. Or do not work at all.&lt;/p&gt;</description></item><item><title>Code simplicity</title><link>https://selenide.org/2019/07/08/code-simplicity/</link><pubDate>Mon, 08 Jul 2019 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2019/07/08/code-simplicity/</guid><description>&lt;p&gt;Let&amp;rsquo;s talk about simplicity of code.&lt;br&gt;
Probably all of you are agree that simple code is a good code.
The problem is that we all understand &amp;ldquo;simplicity&amp;rdquo; differently.&lt;/p&gt;
&lt;p&gt;Let me show an example from one of site comments. So we can compare two variants and decide which one is simple.&lt;/p&gt;
&lt;h3 id="a-goal"&gt;A goal&lt;/h3&gt;
&lt;p&gt;There is some &amp;ldquo;Gmail&amp;rdquo;-like list with checkboxes and titles. We need a page object allowing to find by title and click one or more checkboxes.&lt;/p&gt;</description></item><item><title>Released Selenide 5.2.4</title><link>https://selenide.org/2019/06/20/selenide-5.2.4/</link><pubDate>Thu, 20 Jun 2019 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2019/06/20/selenide-5.2.4/</guid><description>&lt;p&gt;Good evening from the Summer!&lt;/p&gt;
&lt;p&gt;While people are celebrating Midsummer Day and Victory Day in Estonia, we are releasing Selenide 5.2.4.&lt;/p&gt;
&lt;p&gt;What&amp;rsquo;s new there?&lt;/p&gt;
&lt;br/&gt;
&lt;h1 id="we-fixed-proxy-on-localhost"&gt;We fixed proxy on localhost&lt;/h1&gt;
&lt;p&gt;As you know, Selenide can run its own embedded proxy server for some functions (file downloading, authorization, logging etc.).
But last versions of popular browsers (Chrome72+ and Firefox 67+) started denying proxy to intercept requests to &lt;code&gt;localhost&lt;/code&gt;
(for some security reasons).&lt;/p&gt;</description></item><item><title>Released Selenide 5.2.3</title><link>https://selenide.org/2019/05/07/selenide-5.2.3/</link><pubDate>Tue, 07 May 2019 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2019/05/07/selenide-5.2.3/</guid><description>&lt;p&gt;On May, 7 we released Selenide 5.2.3 with small but backward incompatible changes.&lt;/p&gt;
&lt;p&gt;Don&amp;rsquo;t be afraid. Here is goes:&lt;/p&gt;
&lt;br/&gt;
&lt;h1 id="added-method-selenideloggerbeforeevent"&gt;Added method &lt;code&gt;SelenideLogger.beforeEvent()&lt;/code&gt;&lt;/h1&gt;
&lt;p&gt;Sometimes we need to log something BEFORE doing an action. For example, to write a log before any click.
Selenide has interface &lt;code&gt;SelenideLogger&lt;/code&gt;, but it always had only one method &lt;code&gt;onEvent()&lt;/code&gt; which works AFTER an action.
Now we added method &lt;code&gt;beforeEvent&lt;/code&gt;. And renamed &lt;code&gt;onEvent&lt;/code&gt; to &lt;code&gt;afterEvent&lt;/code&gt; to make api cleaner.&lt;/p&gt;</description></item><item><title>Released Selenide 5.2.0</title><link>https://selenide.org/2019/02/19/selenide-5.2.0/</link><pubDate>Tue, 19 Feb 2019 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2019/02/19/selenide-5.2.0/</guid><description>&lt;p&gt;Good evening!&lt;/p&gt;
&lt;p&gt;Now we are publishing press release of Selenide 5.2.0 which was released 19.02.2019.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s quickly read what was changed there, and move on to the next versions.&lt;/p&gt;
&lt;br/&gt;
&lt;h1 id="added-aliases-for-kotlin"&gt;Added aliases for Kotlin&lt;/h1&gt;
&lt;p&gt;Since symbols &lt;code&gt;$&lt;/code&gt; and &lt;code&gt;$$&lt;/code&gt; cannot be used as method name in Kotlin, using Selenide in Kotlin initially was not as pleasant as in Java.
&lt;a href="https://github.com/selenide-examples/kotlin/blob/main/src/test/kotlin/SelenideUsersTest.kt"&gt;Here&lt;/a&gt; you can see some examples of how it could be solved.&lt;/p&gt;</description></item><item><title>Released Selenide 5.1.1</title><link>https://selenide.org/2018/12/31/selenide-5.1.1/</link><pubDate>Mon, 31 Dec 2018 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2018/12/31/selenide-5.1.1/</guid><description>&lt;p&gt;Good night!&lt;/p&gt;
&lt;p&gt;With a big lag and regret, we are publishing press release of Selenide 5.1.1
Let&amp;rsquo;s quickly read what was changed there, and move on to the next versions.&lt;/p&gt;
&lt;h1 id="selenide-allows-clicking-on-transparent-elements"&gt;Selenide allows clicking on transparent elements&lt;/h1&gt;
&lt;p&gt;Until now, Selenide didn&amp;rsquo;t allow clicking elements with &lt;code&gt;opacity: 0&lt;/code&gt;.
It seemed reasonable because real user cannot click element which he cannot see.
But we found that sometimes it&amp;rsquo;s useful - e.g. when there is a file upload field behind the transparent element.&lt;/p&gt;</description></item><item><title>Released Selenide 5.0.1</title><link>https://selenide.org/2018/11/07/selenide-5.0.1/</link><pubDate>Wed, 07 Nov 2018 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2018/11/07/selenide-5.0.1/</guid><description>&lt;p&gt;Good morning!
A month has passed since the release of Selenide 5.0.0. We haven&amp;rsquo;t got any bug reports. :)&lt;/p&gt;
&lt;p&gt;So, we have released Selenide 5.0.1 with minor fixes for old issues.&lt;/p&gt;
&lt;h1 id="generate-random-file-name-for-downloaded-file"&gt;Generate random file name for downloaded file&lt;/h1&gt;
&lt;p&gt;As you know, Selenide has a method for direct file download by link:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Selenide&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;download&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://utdirect.utexas.edu/apps/pts/parking/citations/nlogon/images/6584836/&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It tries to get file name from http header or url. If neither is present (as in example above), it failed.
Now it doesn&amp;rsquo;t fail anymore, but generates a random file name. Though I would consider it as the application bug.&lt;/p&gt;</description></item><item><title>Released Selenide 5.0.0</title><link>https://selenide.org/2018/10/10/selenide-5.0.0/</link><pubDate>Wed, 10 Oct 2018 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2018/10/10/selenide-5.0.0/</guid><description>&lt;p&gt;It finally happened!
We released a major Selenide version 5.0.0&lt;/p&gt;
&lt;p&gt;The biggest change in Selenide 5.0.0 is a global refactoring. This is internal change. It should not (almost) affect you.
For those who are interested - I am going to share refactoring details in a separate post.&lt;/p&gt;
&lt;p&gt;What changes are waiting you in Selenide 5.0.0?&lt;/p&gt;
&lt;h1 id="you-can-open-two-browsers-in-test"&gt;You can open two browsers in test&lt;/h1&gt;
&lt;p&gt;First of all: &lt;em&gt;don&amp;rsquo;t use this feature&lt;/em&gt;!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In most cases, it&amp;rsquo;s a &lt;strong&gt;bad idea&lt;/strong&gt; to open two or three browsers in a test.&lt;/p&gt;</description></item><item><title>Released Selenide 4.14.0</title><link>https://selenide.org/2018/08/29/selenide-4.14.0/</link><pubDate>Wed, 29 Aug 2018 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2018/08/29/selenide-4.14.0/</guid><description>&lt;p&gt;On August 29, 1997 a computer system Skynet became self-aware and launched nuclear missiles at Russia.
So the war between humans and terminators began.&lt;/p&gt;
&lt;p&gt;It happened .. oh, my god! - 21 years ago.
And since we are still alive, we decided to release Selenide 4.14.0 at this historical day.&lt;/p&gt;
&lt;p&gt;There is not so much changes, and they are mostly about Selenide proxy server.&lt;/p&gt;
&lt;br&gt;
&lt;h1 id="we-implemented-basicauth-through-proxy"&gt;We implemented BasicAuth through proxy&lt;/h1&gt;
&lt;p&gt;Test servers are often password-protected (so called BasicAuth).
(I really don&amp;rsquo;t understand why it&amp;rsquo;s needed: they are &lt;em&gt;in intranet&lt;/em&gt; anyway! But nothing to do, people do it.)&lt;/p&gt;</description></item><item><title>Released Selenide 4.13.0</title><link>https://selenide.org/2018/08/20/selenide-4.13.0/</link><pubDate>Mon, 20 Aug 2018 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2018/08/20/selenide-4.13.0/</guid><description>&lt;p&gt;Hi all!&lt;/p&gt;
&lt;p&gt;On August 20, Estonia marks a unique holiday - the Day of Restoration of Independence. 08/20/1991 Estonia regained its independence.
Right now, outside the window, a many-thousands-strong choir sings patriotic songs and thunders salute.&lt;/p&gt;
&lt;p&gt;And I am rolling out to the sounds of the salute &amp;hellip; Selenide 4.13.0&lt;/p&gt;
&lt;p&gt;There were more changes than it seemed to me. :)&lt;/p&gt;
&lt;br&gt;
&lt;h1 id="added-method-lastchild"&gt;Added method &lt;code&gt;$.lastChild()&lt;/code&gt;&lt;/h1&gt;
&lt;p&gt;It finds the last child element of given element. Like &lt;code&gt;$(&amp;quot;table&amp;quot;).lastChild().shouldHave(cssClass(&amp;quot;lastRow&amp;quot;));&lt;/code&gt;&lt;/p&gt;</description></item><item><title>Released Selenide 4.12.3</title><link>https://selenide.org/2018/07/17/selenide-4.12.3/</link><pubDate>Tue, 17 Jul 2018 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2018/07/17/selenide-4.12.3/</guid><description>&lt;p&gt;Good day!
The championship is finally finished, and we can get back to our favorite open-source projects.&lt;/p&gt;
&lt;p&gt;Today we released Selenide 4.12.3&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s look what&amp;rsquo;s inside!&lt;/p&gt;
&lt;br&gt;
&lt;h1 id="added-support-for-junit-5"&gt;Added support for JUnit 5&lt;/h1&gt;
&lt;p&gt;As you know, Selenide has special support for the most popular testing frameworks: JUnit4 and TestNG.
It means special &amp;ldquo;@Rules&amp;rdquo; or &amp;ldquo;Listeners&amp;rdquo;, which can periodically restart a browser, make screenshots etc.&lt;/p&gt;
&lt;p&gt;Now we added similar support for JUnit 5 too:&lt;/p&gt;</description></item><item><title>Released Selenide 4.12.2</title><link>https://selenide.org/2018/06/27/selenide-4.12.2/</link><pubDate>Wed, 27 Jun 2018 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2018/06/27/selenide-4.12.2/</guid><description>&lt;p&gt;We released Selenide 4.12.2&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s see what was changed there.&lt;/p&gt;
&lt;br&gt;
&lt;h1 id="we-added-method-because-for-collections"&gt;We added method &lt;code&gt;because&lt;/code&gt; for collections&lt;/h1&gt;
&lt;p&gt;As you know, Selenide has method &lt;code&gt;because&lt;/code&gt; allowing test author to clarify why he expects this behaviour:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;#login&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;shouldBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;visible&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;because&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;After 3 wrong answers user should be logged out&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now we also have method &lt;code&gt;because&lt;/code&gt; for collections:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;$$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;.error&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;shouldHave&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;3&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;because&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;A separate error message per wrong answer&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;See &lt;a href="https://github.com/selenide/selenide/issues/440"&gt;issue 440&lt;/a&gt; - thanks to &lt;a href="https://github.com/sidelnikovmike"&gt;Mikhail Sidelnikov&lt;/a&gt; for &lt;a href="https://github.com/selenide/selenide/pull/749"&gt;PR 749&lt;/a&gt;&lt;/p&gt;
&lt;br&gt;
&lt;h1 id="selenide-will-not-try-to-open-a-browser"&gt;Selenide will not try to open a browser&lt;/h1&gt;
&lt;p&gt;&amp;hellip; if setting &lt;code&gt;Configuration.reopenBrowserOnFail&lt;/code&gt; is &lt;code&gt;false&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Released Selenide 4.12.1</title><link>https://selenide.org/2018/06/02/selenide-4.12.1/</link><pubDate>Sat, 02 Jun 2018 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2018/06/02/selenide-4.12.1/</guid><description>&lt;p&gt;Good summer!&lt;/p&gt;
&lt;p&gt;With some delay, we post the Selenide 4.12.1 release notes.&lt;/p&gt;
&lt;br&gt;
&lt;h1 id="fixed-name-of-downloaded-file"&gt;Fixed name of downloaded file&lt;/h1&gt;
&lt;p&gt;When you download a file with link containing &lt;code&gt;?&lt;/code&gt; and parameters (like &lt;code&gt;/download/me/selenide-4.11.5.md?sessioncookie=12345&lt;/code&gt;),
Selenide created a local file with name &lt;code&gt;selenide-4.11.5.md?sessioncookie=12345&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Now Selenide will cut all characters from &lt;code&gt;?&lt;/code&gt;. In this case, it will create a file &lt;code&gt;selenide-4.11.5.md&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;See &lt;a href="https://github.com/selenide/selenide/issues/735"&gt;issue 735&lt;/a&gt; - thanks to &lt;a href="https://github.com/rosolko"&gt;Aliaksandr Rasolka&lt;/a&gt; for &lt;a href="https://github.com/selenide/selenide/pull/735"&gt;PR 735&lt;/a&gt;&lt;/p&gt;
&lt;br&gt;
&lt;h1 id="changed-implementation-of-method-seleniderefresh"&gt;Changed implementation of method &lt;code&gt;Selenide.refresh()&lt;/code&gt;&lt;/h1&gt;
&lt;p&gt;This method sometimes didn&amp;rsquo;t actually refresh the page.&lt;br&gt;
We could not reproduce it, but blindly changed the implementation - now it just calls built-in selenium method&lt;br&gt;
&lt;code&gt;webdriver.navigate().refresh()&lt;/code&gt;. Seems that it fixed the problem.&lt;/p&gt;</description></item><item><title>Released Selenide 4.11.4</title><link>https://selenide.org/2018/05/09/selenide-4.11.4/</link><pubDate>Wed, 09 May 2018 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2018/05/09/selenide-4.11.4/</guid><description>&lt;p&gt;We made a mini release Selenide 4.11.4&lt;/p&gt;
&lt;br&gt;
&lt;h1 id="removed-spam-in-logs-from-firefox-driver"&gt;Removed spam in logs from Firefox driver&lt;/h1&gt;
&lt;p&gt;See &lt;a href="https://github.com/selenide/selenide/issues/673"&gt;issue 673&lt;/a&gt; - thanks to &lt;a href="https://github.com/rosolko"&gt;Aliaksandr Rasolka&lt;/a&gt; for &lt;a href="https://github.com/selenide/selenide/pull/732"&gt;PR 732&lt;/a&gt;&lt;/p&gt;
&lt;br&gt;
&lt;h1 id="upgraded-dependencies"&gt;Upgraded dependencies&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;selenium 3.12.0&lt;/li&gt;
&lt;li&gt;gson:2.8.4&lt;/li&gt;
&lt;li&gt;guava:25.0&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;p&gt;&lt;a href="http://asolntsev.github.io/"&gt;Andrei Solntsev&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;selenide.org&lt;/p&gt;</description></item><item><title>Released Selenide 4.11.3</title><link>https://selenide.org/2018/05/08/selenide-4.11.3/</link><pubDate>Tue, 08 May 2018 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2018/05/08/selenide-4.11.3/</guid><description>&lt;p&gt;We released Selenide 4.11.3. Let&amp;rsquo;s see what updates it contains:&lt;/p&gt;
&lt;br&gt;
&lt;h1 id="reveal-selenide-proxy-server"&gt;You can now get access to proxy server&lt;/h1&gt;
&lt;p&gt;As you know, Selenide starts a built-in proxy server (BrowserMobProxy).
But until now, you could not use it because it was private. Selenide used it only for downloading files.&lt;/p&gt;
&lt;p&gt;Now we added a public method which allows you to get the &lt;code&gt;BrowserMobProxy&lt;/code&gt; instance and use as you wish:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;BrowserMobProxy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bmp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;WebDriverRunner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getSelenideProxy&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getProxy&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Please tell us in comments how you are going to use it!&lt;/p&gt;</description></item><item><title>Released Selenide 4.11.2</title><link>https://selenide.org/2018/04/25/selenide-4.11.2/</link><pubDate>Wed, 25 Apr 2018 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2018/04/25/selenide-4.11.2/</guid><description>&lt;p&gt;Dear friends,
we released Selenide 4.11.2. Below you can find the notable changes of this release.&lt;/p&gt;
&lt;br&gt;
&lt;h1 id="now-you-can-make-screenshots-inside-iframe"&gt;Now you can make screenshots inside &lt;code&gt;iframe&lt;/code&gt;&lt;/h1&gt;
&lt;p&gt;You can find examples in &lt;a href="https://github.com/selenide/selenide/blob/master/statics/src/test/java/integration/ScreenshotInIframeTest.java"&gt;ScreenshotInIframeTest&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;SelenideElement&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;iframe&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;#iframe_page&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;SelenideElement&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;element&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;#small_div&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Screenshots&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;takeScreenShot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;iframe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;element&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Thanks to &lt;a href="https://github.com/andrejska"&gt;Andrejs Kalnačs&lt;/a&gt; for &lt;a href="https://github.com/selenide/selenide/pull/705"&gt;PR 705&lt;/a&gt;&lt;/p&gt;
&lt;br&gt;
&lt;h1 id="we-added-method-atbottom"&gt;We added method &lt;code&gt;atBottom()&lt;/code&gt;&lt;/h1&gt;
&lt;p&gt;Now you can check if a page is scrolled to the bottom:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;assertFalse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;atBottom&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;executeJavaScript&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;return window.scrollTo(0, document.body.scrollHeight);&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;assertTrue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;atBottom&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can find examples in &lt;a href="https://github.com/selenide/selenide/blob/master/statics/src/test/java/integration/PageAtBottomTest.java"&gt;PageAtBottomTest&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Released Selenide 4.11.1</title><link>https://selenide.org/2018/04/03/selenide-4.11.1/</link><pubDate>Tue, 03 Apr 2018 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2018/04/03/selenide-4.11.1/</guid><description>&lt;p&gt;Dear friends,
We recently moved to &amp;ldquo;Semantic versioning&amp;rdquo;. Now Selenide versions will be called 4.11.x and released more often.&lt;/p&gt;
&lt;p&gt;In Selenide 4.11.1 we did only one fix:&lt;/p&gt;
&lt;br&gt;
&lt;h1 id="fixed-a-problem-with-hanging-chrome-on-windows"&gt;Fixed a problem with hanging Chrome on Windows&lt;/h1&gt;
&lt;p&gt;Windows users complained that even after calling &lt;code&gt;Selenide.close()&lt;/code&gt; process &lt;code&gt;chrome.exe&lt;/code&gt; still hangs in task manager.
Though it&amp;rsquo;s not a Selenide bug, we managed to tune webdriver settings, so that Chrome is properly closed now.&lt;/p&gt;
&lt;p&gt;Thanks to &lt;a href="https://github.com/rosolko"&gt;Aliaksandr Rasolka&lt;/a&gt; for &lt;a href="https://github.com/selenide/selenide/pull/711"&gt;PR 711&lt;/a&gt;!&lt;/p&gt;</description></item><item><title>Released Selenide 4.11.0</title><link>https://selenide.org/2018/04/02/selenide-4.11/</link><pubDate>Mon, 02 Apr 2018 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2018/04/02/selenide-4.11/</guid><description>&lt;p&gt;Good morning, my friends!&lt;/p&gt;
&lt;p&gt;We released Selenide 4.11.0. What&amp;rsquo;s new there?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2018/04/02/selenide-4.11/#updade-to-selenium-3.11.0"&gt;Upgraded to selenium 3.11.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2018/04/02/selenide-4.11/#texts-in-any-order"&gt;Collection condition &lt;code&gt;textsInAnyOrder&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2018/04/02/selenide-4.11/#browser-position"&gt;Browser position&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2018/04/02/selenide-4.11/#download-files-with-cyrillic-letters"&gt;Download files with non-ascii characters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2018/04/02/selenide-4.11/#chrome-prefs"&gt;Pass &lt;code&gt;chromeoptions.prefs&lt;/code&gt; to webdriver&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2018/04/02/selenide-4.11/#proxy-filters"&gt;Request/response interceptors in Selenide proxy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2018/04/02/selenide-4.11/#deprecate-follow-link"&gt;Deprecate &lt;code&gt;$.followLink()&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2018/04/02/selenide-4.11/#null-pointer-in-selenide-report"&gt;NullPointerException in SelenideReport&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2018/04/02/selenide-4.11/#take-screenshot-for-soft-asserts"&gt;Screenshot for soft asserts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2018/04/02/selenide-4.11/#news"&gt;News&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selenide.org/2018/04/02/selenide-4.11/#resources"&gt;Resources&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;h1 id="updade-to-selenium-3.11.0"&gt;Upgraded to selenium 3.11.0&lt;/h1&gt;
&lt;p&gt;The main &lt;a href="https://raw.githubusercontent.com/SeleniumHQ/selenium/master/java/CHANGELOG"&gt;changes in selenium 3.11.0&lt;/a&gt; are about Internet Explorer and Windows platform.&lt;/p&gt;
&lt;p&gt;And also:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;removed methods &lt;code&gt;startClient&lt;/code&gt; and &lt;code&gt;stopClient&lt;/code&gt; in class &lt;code&gt;RemoteWebDriver&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;remove properties &lt;code&gt;SafariOptions.cleanSession&lt;/code&gt; and &lt;code&gt;SafariOptions.port&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;h1 id="texts-in-any-order"&gt;Added collection condition &lt;code&gt;textsInAnyOrder&lt;/code&gt;&lt;/h1&gt;
&lt;p&gt;Now you can write more advanced check for collections:&lt;/p&gt;</description></item><item><title>Released Selenide 4.10</title><link>https://selenide.org/2018/01/12/selenide-4.10/</link><pubDate>Fri, 12 Jan 2018 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2018/01/12/selenide-4.10/</guid><description>&lt;p&gt;Good night, Seleniders!&lt;/p&gt;
&lt;p&gt;We recently got a chance to merge a lot of pull requests and released Selenide 4.10&lt;/p&gt;
&lt;p&gt;So, what&amp;rsquo;s new there?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What you get when update to Selenide 4.10&lt;/strong&gt;?&lt;/p&gt;
&lt;br&gt;
&lt;h1 id="we-added-method-scrollintoview"&gt;We added method &lt;code&gt;$.scrollIntoView()&lt;/code&gt;&lt;/h1&gt;
&lt;p&gt;You can use it to scroll browser to the right place.
For example, it can be useful to overcome issues of some browser which cannot click an element that is outside of visible window area.&lt;/p&gt;</description></item><item><title>Released Selenide 4.9</title><link>https://selenide.org/2017/12/20/selenide-4.9/</link><pubDate>Wed, 20 Dec 2017 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2017/12/20/selenide-4.9/</guid><description>&lt;p&gt;Good night!&lt;/p&gt;
&lt;p&gt;At the very last moment of year 2017, we released Selenide 4.9.&lt;/p&gt;
&lt;p&gt;What&amp;rsquo;s new there?&lt;/p&gt;
&lt;h1 id="upgraded-to-selenium-381"&gt;Upgraded to selenium 3.8.1&lt;/h1&gt;
&lt;p&gt;There are &lt;a href="https://raw.githubusercontent.com/SeleniumHQ/selenium/master/java/CHANGELOG"&gt;backward-incompatible changes&lt;/a&gt;, be prepared.
Selenium guys like to delete existing functionality :)&lt;/p&gt;
&lt;p&gt;Thanks to &lt;a href="https://github.com/rosolko"&gt;Aleksandr Rasolka&lt;/a&gt; for &lt;a href="https://github.com/selenide/selenide/pull/638"&gt;pull request 638&lt;/a&gt;.&lt;/p&gt;
&lt;br&gt;
&lt;h1 id="now-marionette-is-used-by-default"&gt;Now marionette is used by default&lt;/h1&gt;
&lt;p&gt;As you know, Selenide initially used Firefox as a default browser.
The reason is simple: it was the only webdriver that didn&amp;rsquo;t require downloading a separate binary to drive the browser.&lt;/p&gt;</description></item><item><title>Released Selenide 4.8</title><link>https://selenide.org/2017/10/08/selenide-4.8/</link><pubDate>Sun, 08 Oct 2017 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2017/10/08/selenide-4.8/</guid><description>&lt;p&gt;Good evening!&lt;/p&gt;
&lt;p&gt;We released Selenide 4.8. It&amp;rsquo;s mainly a Selenium upgrade.&lt;/p&gt;
&lt;h1 id="upgraded-to-selenium-36"&gt;Upgraded to selenium 3.6&lt;/h1&gt;
&lt;p&gt;This version contains some backward incompatible changes, that&amp;rsquo;s why we decided to make a separate release.&lt;/p&gt;
&lt;p&gt;Thanks to &lt;a href="https://github.com/ostap-oleksyn"&gt;Ostap Oleksyn&lt;/a&gt; for &lt;a href="https://github.com/selenide/selenide/pull/611"&gt;pull request 611&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;By the way, we also upgraded to &lt;code&gt;guava 23.0&lt;/code&gt; and &lt;code&gt;org.apache.httpcomponents:httpcore:4.4.7&lt;/code&gt;.&lt;/p&gt;
&lt;h1 id="fix-an-error-with-soft-asserts"&gt;Fix an error with soft asserts&lt;/h1&gt;
&lt;p&gt;Thanks to &lt;a href="https://github.com/ostap-oleksyn"&gt;Ostap Oleksyn&lt;/a&gt; for fixing &lt;a href="https://github.com/selenide/selenide/issues/614"&gt;issue 614&lt;/a&gt;&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;That&amp;rsquo;s it. This time the upgrade should be easy.&lt;/p&gt;
&lt;h2 id="friendly-reminder"&gt;Friendly reminder&lt;/h2&gt;
&lt;p&gt;Welcome to the &lt;a href="https://heisenbug-moscow.ru/"&gt;Heisenbug conference&lt;/a&gt; in Moscow - 8-9.12.2017&lt;/p&gt;</description></item><item><title>Released Selenide 4.7</title><link>https://selenide.org/2017/09/30/selenide-4.7/</link><pubDate>Sat, 30 Sep 2017 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2017/09/30/selenide-4.7/</guid><description>&lt;p&gt;Good evening!&lt;/p&gt;
&lt;p&gt;We released Selenide 4.7 with the most wanted feature of the year. You&amp;rsquo;ll live the life now!&lt;/p&gt;
&lt;br&gt;
&lt;h1 id="embedded-webdrivermanager"&gt;Embedded WebDriverManager&lt;/h1&gt;
&lt;p&gt;Now Selenide contains &lt;a href="https://github.com/bonigarcia/webdrivermanager"&gt;WebDriverManager&lt;/a&gt; - a library that can automatically download latest webdriver binary file.
You don&amp;rsquo;t need to care about downloading &lt;code&gt;geckodriver.exe&lt;/code&gt; or &lt;code&gt;chromedriver.exe&lt;/code&gt; and adding it to &lt;code&gt;PATH&lt;/code&gt;.
Selenide will take care about it.&lt;/p&gt;
&lt;p&gt;There is one nuance. WebDriverManager will only work if:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;You use one of supported webdrivers: &lt;code&gt;chrome&lt;/code&gt;, &lt;code&gt;edge&lt;/code&gt;, &lt;code&gt;internet explorer&lt;/code&gt;, &lt;code&gt;opera&lt;/code&gt;, &lt;code&gt;phantomjs&lt;/code&gt;, &lt;code&gt;marionette&lt;/code&gt; or &lt;code&gt;gecko&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Your code hasn&amp;rsquo;t set system property &lt;code&gt;webdriver.chrome.driver&lt;/code&gt;, &lt;code&gt;webdriver.edge.driver&lt;/code&gt;, &lt;code&gt;webdriver.ie.driver&lt;/code&gt;, &lt;code&gt;webdriver.opera.driver&lt;/code&gt;, &lt;code&gt;phantomjs.binary.path&lt;/code&gt; or &lt;code&gt;webdriver.gecko.driver&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you use another webdriver (or a custom &lt;code&gt;WebDriverProvider&lt;/code&gt;), WebDriverManager will not be used, and you will continue working as previously.&lt;/p&gt;</description></item><item><title>Released Selenide 4.6</title><link>https://selenide.org/2017/09/09/selenide-4.6/</link><pubDate>Sat, 09 Sep 2017 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2017/09/09/selenide-4.6/</guid><description>&lt;p&gt;Good night!&lt;/p&gt;
&lt;p&gt;We released Selenide 4.6&lt;/p&gt;
&lt;br&gt;
&lt;h1 id="method-shouldhaveexactvalue-foo---does-not-trim-leadingtrailing-spaces-anymore"&gt;Method &lt;code&gt;$.shouldHave(exactValue(&amp;quot; foo &amp;quot;))&lt;/code&gt; does not trim leading/trailing spaces anymore&lt;/h1&gt;
&lt;p&gt;As you probably know, method &lt;code&gt;$.shouldHave(value(&amp;quot; foo &amp;quot;))&lt;/code&gt; (which we all typically use) trims leading/trailing spaces in the given string.
It&amp;rsquo;s convenient because web browsers also do so. But we recently found that method &lt;code&gt;exactValue()&lt;/code&gt; also do it, and that&amp;rsquo;s not right.&lt;/p&gt;
&lt;p&gt;Assuming that you have &lt;code&gt;&amp;lt;textarea value=&amp;quot;Regression test description &amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;/code&gt; on a page,
the check &lt;code&gt;$(&amp;quot;textarea&amp;quot;).shouldHave(exactValue(&amp;quot;Regression test description &amp;quot;));&lt;/code&gt; failed before this release. Not it will not.&lt;/p&gt;</description></item><item><title>Released Selenide 4.5</title><link>https://selenide.org/2017/06/26/selenide-4.5/</link><pubDate>Mon, 26 Jun 2017 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2017/06/26/selenide-4.5/</guid><description>&lt;p&gt;Good evening!&lt;/p&gt;
&lt;p&gt;We released Selenide 4.5!
This release is mainly dedicated to performance improvements of Selenide itself.&lt;/p&gt;
&lt;br&gt;
&lt;h1 id="speed-up-method-setvalue"&gt;Speed up method &lt;code&gt;$.setValue()&lt;/code&gt;&lt;/h1&gt;
&lt;p&gt;Selenide had a cool feature&amp;hellip; that nobody knew about.
Method &lt;code&gt;$.setValue()&lt;/code&gt; pretended to be smart so much it could set value not only to text inputs,
but also to selects and radio buttons. The idea was that test should remain stable even
if developers change element&amp;rsquo;s type (say, from &lt;code&gt;&amp;lt;select&amp;gt;&lt;/code&gt; to &lt;code&gt;&amp;lt;input type=&amp;quot;radio&amp;quot;&amp;gt;&lt;/code&gt;).&lt;/p&gt;</description></item><item><title>Released Selenide 4.3</title><link>https://selenide.org/2017/02/09/selenide-4.3/</link><pubDate>Thu, 09 Feb 2017 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2017/02/09/selenide-4.3/</guid><description>&lt;p&gt;Hi all!&lt;/p&gt;
&lt;p&gt;Good news: we released Selenide 4.3&lt;/p&gt;
&lt;br/&gt;
&lt;h1 id="fix-method-find"&gt;Fix method &lt;code&gt;$$().find()&lt;/code&gt;&lt;/h1&gt;
&lt;p&gt;More exactly, it always could find elements correctly, but it gave a misleading error message in
case element could not be found.&lt;/p&gt;
&lt;p&gt;Now it&amp;rsquo;s fixes and gives correct error message.&lt;/p&gt;
&lt;p&gt;See. &lt;a href="https://github.com/selenide/selenide/pull/426"&gt;pull request 426&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Thanks to &lt;a href="https://github.com/juliaviluhina"&gt;Julia Iluhina&lt;/a&gt; for the fix!&lt;/p&gt;
&lt;br/&gt;
&lt;h1 id="fixed-page-object-fields-selenideelement-without-findby-annotation"&gt;Fixed page object fields &lt;code&gt;SelenideElement&lt;/code&gt; without &lt;code&gt;@FindBy&lt;/code&gt; annotation&lt;/h1&gt;
&lt;p&gt;Surprisingly, we found that Selenide could behave unexpectedly when you tried to use it unexpectedly. :)&lt;/p&gt;</description></item><item><title>Selenide 4.2.1 released</title><link>https://selenide.org/2017/01/26/selenide-4.2.1/</link><pubDate>Thu, 26 Jan 2017 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2017/01/26/selenide-4.2.1/</guid><description>&lt;br/&gt;
&lt;p&gt;Hi!&lt;/p&gt;
&lt;p&gt;This is a bugfix and enhancements release following &amp;ldquo;4.2(Browsers)&amp;rdquo;&lt;/p&gt;
&lt;h2 id="fixed-usage-of-booleaninteger-capabilities-as-command-line-system-properties"&gt;Fixed usage of boolean/integer capabilities as command line system properties.&lt;/h2&gt;
&lt;p&gt;Since this release capabilities values are automatically converted to boolean/integer if transferred in SystemProperties,
so for example the following parameters will be working fine&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code&gt;-Dcapabilities.rotatable=true
-Dcapabilities.elementScrollBehavior=1&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="firefox-support-for-firefoxprofile-preferences-over-command-line"&gt;Firefox: support for FirefoxProfile preferences over command line&lt;/h2&gt;
&lt;p&gt;Good news for users who need to transfer FirefoxProfile preferences to the WebDriver.
&lt;code&gt;firefoxprofile.*&lt;/code&gt; are now automatically processed by Selenide and transferred to Firefox and Marionette drivers.&lt;/p&gt;</description></item><item><title>Selenide 4.2 released</title><link>https://selenide.org/2016/12/30/selenide-4.2/</link><pubDate>Fri, 30 Dec 2016 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2016/12/30/selenide-4.2/</guid><description>&lt;br/&gt;
&lt;p&gt;Hi!&lt;/p&gt;
&lt;p&gt;With 4.x we&amp;rsquo;ve just started to add useful features for communication with the constantly changing environment,
and in this version we made a great step forward in supporting browsers.&lt;/p&gt;
&lt;h2 id="support-of-legacy-firefox-driver-431"&gt;Support of legacy Firefox driver. &lt;a href="https://github.com/selenide/selenide/issues/431"&gt;#431&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;As you may know, Firefox, starting with Firefox 48, is not supported by built-in Selenium driver
(let&amp;rsquo;s name it legacy driver). You must use new marionette/gecko driver, which also works with
the older version of Firefox, but, it is not yet that stable in many cases. We experienced many projects
with a large number of test switched to use Firefox 45 ESR, with the legacy driver, instead of the newest
Firefox, because of high costs for analysis and changes for broken tests with the new driver.
In 4.2 you may choose, which driver to use for Firefox version &amp;lt;=47&lt;/p&gt;</description></item><item><title>Released Selenide 4.1</title><link>https://selenide.org/2016/12/01/selenide-4.1/</link><pubDate>Thu, 01 Dec 2016 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2016/12/01/selenide-4.1/</guid><description>&lt;p&gt;Achievement unlocked!&lt;/p&gt;
&lt;p&gt;This day came. We releases Selenide 4.1 that contain only your changes. Made by you. Your pull requests.&lt;/p&gt;
&lt;br/&gt;
&lt;h1 id="428-improve-byattribute-method-for-search-via-css-selectors"&gt;#428 Improve byAttribute method for search via css selectors&lt;/h1&gt;
&lt;p&gt;Method &lt;code&gt;byAttribute&lt;/code&gt; (or shorter &lt;code&gt;by&lt;/code&gt;) got more powerful.
Before now, you could use it to find elements by attribute value:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;$&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="s"&gt;&amp;#34;first-name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;john macclane&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;click&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now you can use it to search element by substring in attribute:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;$&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="s"&gt;&amp;#34;first-name*&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;hn maccl&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;click&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;by a starting of attribute:&lt;/p&gt;</description></item><item><title>Selenide presentation on TopConf 2016</title><link>https://selenide.org/2016/11/16/selenide-on-topconf/</link><pubDate>Wed, 16 Nov 2016 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2016/11/16/selenide-on-topconf/</guid><description>&lt;p&gt;Good evening!&lt;/p&gt;
&lt;p&gt;I recently &lt;a href="http://topconf.com/tallinn-2016/trackevent/selenide-concise-ui-tests-in-java/"&gt;presented Selenide&lt;/a&gt; on TopConf conference in Tallinn.&lt;/p&gt;
&lt;p&gt;Video:&lt;/p&gt;
&lt;iframe src="//www.youtube.com/embed/hHwFIONnVRs" width="960" height="569" frameborder="0"&gt;&lt;/iframe&gt; 
&lt;p&gt;And my presentation:&lt;/p&gt;
&lt;div class="wrapper-content center"&gt;
&lt;iframe src="https://docs.google.com/presentation/d/1kH4tQuZujMYgW_gcHI0-ekNxV7dGspZbNIb4DVUgURs/embed?start=false&amp;loop=false&amp;delayms=3000" frameborder="0" width="960" height="569" allow="fullscreen" mozallowfullscreen="true" webkitallowfullscreen="true"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;br/&gt;
&lt;p&gt;Andrei Solntsev&lt;/p&gt;
&lt;p&gt;selenide.org&lt;/p&gt;</description></item><item><title>A wrapper or pure Selenium?</title><link>https://selenide.org/2016/10/20/selenide-vs-pure-selenium/</link><pubDate>Thu, 20 Oct 2016 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2016/10/20/selenide-vs-pure-selenium/</guid><description>&lt;p&gt;There is a popular opinion that using Selenide is not serious for a &amp;ldquo;true&amp;rdquo; automation engineer.&lt;br&gt;
A real engineer should use pure Selenium to understand how it works inside.&lt;/p&gt;
&lt;p&gt;And that&amp;rsquo;s why it&amp;rsquo;s bad.&lt;/p&gt;
&lt;h2 id="a-story-of-true-driver"&gt;A story of true driver&lt;/h2&gt;
&lt;p&gt;Imagine: you are in a great hurry to get on the plane. Get in a taxi, say: &amp;ldquo;Urgently to the airport!&amp;rdquo;
And the taxi driver tells you: now I will put the motor on the frame, fasten the wheels, fill up the fuel - and we will go!&lt;/p&gt;</description></item><item><title>Released Selenide 4.0</title><link>https://selenide.org/2016/10/15/selenide-4.0/</link><pubDate>Sat, 15 Oct 2016 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2016/10/15/selenide-4.0/</guid><description>&lt;p&gt;Hi all!&lt;/p&gt;
&lt;p&gt;It happened, finally!&lt;/p&gt;
&lt;p&gt;After 3-years-length waiting, Selenium WebDriver 3.0 was released.&lt;/p&gt;
&lt;p&gt;And we released Selenide 4.0.&lt;/p&gt;
&lt;h2 id="what-changed"&gt;What changed?&lt;/h2&gt;
&lt;p&gt;Actually nothing should change for you. They just cleared some legacy
garbage from selenium (that was never used by Selenide).&lt;/p&gt;
&lt;p&gt;What is actually important that Selenide now requires Java 8.&lt;/p&gt;
&lt;p&gt;Hurrra!!! Now QA world will finally move to Java 8 and lambdas!&lt;/p&gt;
&lt;h2 id="can-i-get-more-details"&gt;Can I get more details!&lt;/h2&gt;
&lt;p&gt;Sure. Here is a &lt;a href="https://seleniumhq.wordpress.com/2016/10/13/selenium-3-0-out-now/"&gt;list of Selenium WebDriver 3.0.0 changes&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Released Selenide 3.11</title><link>https://selenide.org/2016/10/14/selenide-3.11/</link><pubDate>Fri, 14 Oct 2016 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2016/10/14/selenide-3.11/</guid><description>&lt;p&gt;Good evening!&lt;/p&gt;
&lt;p&gt;We released Selenide 3.11!
This is the last release in 3.x series. The last working on Java 7 and Selenium WebDriver 2.x&lt;/p&gt;
&lt;p&gt;The following is Selenide 4.x: Selenium WebDriver 3.x and Java 8.&lt;/p&gt;
&lt;p&gt;So, what we have in Selenide 3.11:&lt;/p&gt;
&lt;h2 id="added-condition-checked"&gt;Added condition &lt;code&gt;checked&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Now you can write readable test for checkbox:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;#i-agree&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;shouldBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;checked&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Before now, you had to write &lt;code&gt;$.shouldBe(selected)&lt;/code&gt; which is not pretty clear.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Check&lt;/strong&gt;box should be &lt;strong&gt;checked&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>BDD with Selenide</title><link>https://selenide.org/2016/09/28/bdd-with-selenide/</link><pubDate>Wed, 28 Sep 2016 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2016/09/28/bdd-with-selenide/</guid><description>&lt;p&gt;Hi!&lt;/p&gt;
&lt;p&gt;People often ask if they can use BDD with Selenide.&lt;/p&gt;
&lt;p&gt;Short answer: Yes, you can!&lt;/p&gt;
&lt;p&gt;There is plenty of BDD tools in Java and Python. You can use any of them with Selenide.
Some working examples:
Selenide + Cucumber:
&lt;a href="https://github.com/selenide-examples/cucumber/tree/master/src/test/resources/org/selenide/examples/cucumber"&gt;https://github.com/selenide-examples/cucumber/tree/master/src/test/resources/org/selenide/examples/cucumber&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Selenide + JBehave:
&lt;a href="https://gist.github.com/mp911de/009ea539271da0633c59"&gt;https://gist.github.com/mp911de/009ea539271da0633c59&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Selenide + GEB:
&lt;a href="https://github.com/selenide-examples/geb-maven-tutorial/blob/master/src/test/groovy/stepdefs/IndexStepDefs.groovy"&gt;https://github.com/selenide-examples/geb-maven-tutorial/blob/master/src/test/groovy/stepdefs/IndexStepDefs.groovy&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Selenide + Gauge:
&lt;a href="https://github.com/selenide-examples/GaugeSelenideExample/blob/master/specs/example.spec"&gt;https://github.com/selenide-examples/GaugeSelenideExample/blob/master/specs/example.spec&lt;/a&gt;
You can find a whole book here full of examples with Selenide, JBehave and Cucumber:
&lt;a href="https://www.amazon.com/Test-Driven-Java-Development-Viktor-Farcic/dp/1783987421?tag=viglink12630-20"&gt;https://www.amazon.com/Test-Driven-Java-Development-Viktor-Farcic/dp/1783987421?tag=viglink12630-20&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;P.S. I personally don&amp;rsquo;t value BDD really much. I think it&amp;rsquo;s a nice idea, but it doesn&amp;rsquo;t really work. Business stakeholders do not really write executable specifications.&lt;/p&gt;</description></item><item><title>Released Selenide 3.10</title><link>https://selenide.org/2016/09/26/selenide-3.10/</link><pubDate>Mon, 26 Sep 2016 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2016/09/26/selenide-3.10/</guid><description>&lt;p&gt;Hi!&lt;/p&gt;
&lt;p&gt;We released Selenide 3.10!&lt;/p&gt;
&lt;h2 id="proxy-server-is-disabled-by-default"&gt;Proxy server is disabled by default&lt;/h2&gt;
&lt;p&gt;It&amp;rsquo;s
I am sad to say this, but it seems that the experiment with a proxy server has not yet succeeded.&lt;/p&gt;
&lt;p&gt;There is a problem with the &amp;ldquo;new way&amp;rdquo; of downloading files using Selenide built-in proxy server.
It works for all my projects, but some folks reported that it doesn&amp;rsquo;t work for them.
I still don&amp;rsquo;t know exactly the problem and its causes.
Probably those who use Selenium Grid experience this problem.&lt;/p&gt;</description></item><item><title>Released Selenide 3.9.2</title><link>https://selenide.org/2016/09/03/selenide-3.9.2/</link><pubDate>Sat, 03 Sep 2016 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2016/09/03/selenide-3.9.2/</guid><description>&lt;p&gt;Good evening!&lt;/p&gt;
&lt;p&gt;We released Selenide 3.9.2!&lt;/p&gt;
&lt;br/&gt;
&lt;br/&gt;
&lt;h2 id="you-can-download-files-differently"&gt;You can download files differently&lt;/h2&gt;
&lt;p&gt;As you know, we changed a way of downloading files in Selenide 3.9.
We got quite different feedback: some folks reported that new way works for cases where old way didn&amp;rsquo;t work,
while others reported that the new way doesn&amp;rsquo;t work for cases where the old way worked.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s why we decided to provide users a choice.&lt;/p&gt;</description></item><item><title>Released Selenide 3.9.1</title><link>https://selenide.org/2016/08/27/selenide-3.9.1/</link><pubDate>Sat, 27 Aug 2016 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2016/08/27/selenide-3.9.1/</guid><description>&lt;p&gt;Hi all!&lt;/p&gt;
&lt;p&gt;We released Selenide 3.9.1!&lt;/p&gt;
&lt;br/&gt;
&lt;br/&gt;
&lt;h3 id="killer-feature-selenide-can-now-download-any-files-from-anywhere"&gt;Killer feature! Selenide can now download &lt;strong&gt;any&lt;/strong&gt; files. From anywhere.&lt;/h3&gt;
&lt;p&gt;We planned to do it for a long, and now it finally happened!
Those endless problems with downloading files in Selenium are over.
Now it&amp;rsquo;s easy. Just one simple method for all cases:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;report&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;input#submit&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;download&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Actually method &lt;code&gt;download&lt;/code&gt; existed in Selenide for a long time.
But it could only download files from links with href attribute: &lt;code&gt;&amp;lt;a href&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Released Selenide 3.8</title><link>https://selenide.org/2016/08/06/selenide-3.8/</link><pubDate>Sat, 06 Aug 2016 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2016/08/06/selenide-3.8/</guid><description>&lt;p&gt;Good night!&lt;/p&gt;
&lt;p&gt;We released Selenide 3.8! It fixes some small issues and introduces small but useful features.&lt;/p&gt;
&lt;br/&gt;
&lt;h3 id="fixed-file-uploading-on-remote-browsers-in-grid"&gt;Fixed file uploading on remote browsers in Grid&lt;/h3&gt;
&lt;p&gt;Thanks to &lt;a href="https://github.com/vinogradoff"&gt;Alexei Vinogradov&lt;/a&gt; for fixing remote upload!&lt;/p&gt;
&lt;h3 id="now-you-can-disable-automatic-creating-of-html-files"&gt;Now you can disable automatic creating of *.html files&lt;/h3&gt;
&lt;p&gt;When your test fails, Selenide automatically saves 2 files:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Screenshot - *.png file&lt;/li&gt;
&lt;li&gt;Page source code - *.html file&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;But sometimes people don&amp;rsquo;t want to save *.html files. For example, in case of
single page application the page source contains html code of all application pages. Thus it&amp;rsquo;s too big and useless.&lt;/p&gt;</description></item><item><title>Released Selenide 3.7</title><link>https://selenide.org/2016/07/08/selenide-3.7/</link><pubDate>Fri, 08 Jul 2016 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2016/07/08/selenide-3.7/</guid><description>&lt;p&gt;Hi all!&lt;/p&gt;
&lt;p&gt;We released Selenide 3.7!&lt;/p&gt;
&lt;h2 id="upgraded-to-selenium-2531"&gt;Upgraded to Selenium 2.53.1&lt;/h2&gt;
&lt;p&gt;It should fix the problem with Firefox 47.&lt;/p&gt;
&lt;h2 id="added-support-for-marionette-browser"&gt;Added support for Marionette browser&lt;/h2&gt;
&lt;p&gt;To run your tests with Marionette browser, you can set parameter in command line (or build script):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code&gt;-Dselenide.browser=marionette&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;or set browser directly in your tests:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Configuration&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;browser&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;marionette&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;see. &lt;a href="https://github.com/selenide/selenide/pull/349"&gt;pull request #349&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Thanks to &lt;a href="https://github.com/ridiekel"&gt;Geroen Dierckx&lt;/a&gt; for this pull request!&lt;/p&gt;
&lt;h2 id="added-support-for-non-web-drivers"&gt;Added support for non-web drivers&lt;/h2&gt;
&lt;p&gt;There are some &amp;ldquo;webdrivers&amp;rdquo; that do not actually drive web-browsers, but&lt;/p&gt;</description></item><item><title>Released Selenide 3.6</title><link>https://selenide.org/2016/06/01/selenide-3.6/</link><pubDate>Wed, 01 Jun 2016 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2016/06/01/selenide-3.6/</guid><description>&lt;p&gt;Good day!&lt;/p&gt;
&lt;p&gt;In the last day of spring, we released Selenide 3.6.&lt;/p&gt;
&lt;h2 id="reverted-page-loading-strategy-to-normal"&gt;Reverted page loading strategy to &lt;code&gt;normal&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;In Selenide 3.5 we set default page loading strategy to &lt;code&gt;none&lt;/code&gt;.
It made tests faster for some users, but other users complained that it broke their tests,
so that they had to rollback to Selenide 3.4.&lt;/p&gt;
&lt;p&gt;Now the default page loading strategy is again &lt;code&gt;normal&lt;/code&gt; (it&amp;rsquo;s Selenium default).
If you want to speed up your tests, just configure&lt;/p&gt;</description></item><item><title>Released Selenide 3.5</title><link>https://selenide.org/2016/03/31/selenide-3.5/</link><pubDate>Thu, 31 Mar 2016 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2016/03/31/selenide-3.5/</guid><description>&lt;p&gt;Hi all!&lt;/p&gt;
&lt;p&gt;We released Selenide 3.5 with flexible collection size checks.&lt;/p&gt;
&lt;h2 id="we-added-flexible-checks-for-collection-size"&gt;We added flexible checks for collection size&lt;/h2&gt;
&lt;p&gt;Before now, we could only check the exact size of collection:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;$$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;.man.angry&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;shouldHave&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;12&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now we can use flexible checks: &amp;lt;, &amp;lt;=, &amp;gt;, &amp;gt;=, &amp;lt;&amp;gt;&lt;/p&gt;
&lt;p&gt;Simple like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;$$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;.man.angry&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;shouldHave&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sizeLessThan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;13&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;$$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;.man.angry&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;shouldHave&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sizeLessThanOrEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;12&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;$$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;.man.angry&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;shouldHave&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sizeGreaterThan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;11&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;$$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;.man.angry&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;shouldHave&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sizeGreaterThanOrEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;12&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;$$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;.man.angry&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;shouldHave&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sizeNotEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;42&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Thanks to &lt;a href="https://github.com/vasilevichra"&gt;vasilevichra&lt;/a&gt; for this pull request!&lt;/p&gt;
&lt;p&gt;P.S. Actually I am still not sure that this is a good idea.
I think that test must prepare required preconditions before running application.
It means that test must always know exactly how many elements should be on the page at every moment.
But we implemented it because users kindly asked for it.&lt;/p&gt;</description></item><item><title>Released Selenide 3.3</title><link>https://selenide.org/2016/02/11/selenide-3.3/</link><pubDate>Thu, 11 Feb 2016 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2016/02/11/selenide-3.3/</guid><description>&lt;p&gt;Good evening!&lt;/p&gt;
&lt;p&gt;We released Selenide 3.3 with support for collections.&lt;/p&gt;
&lt;h2 id="ajax-support-for-collections"&gt;Ajax support for collections&lt;/h2&gt;
&lt;p&gt;Now collection methods &lt;code&gt;$$&lt;/code&gt; can wait until collection elements get loaded.
It can be useful for collections that are loaded asynchronously with Ajax.&lt;/p&gt;
&lt;p&gt;See. &lt;a href="https://github.com/selenide/selenide/issues/277"&gt;issue #277&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="added-separate-timeout-for-collections"&gt;Added separate timeout for collections&lt;/h2&gt;
&lt;p&gt;We added two configuration parameters:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;collectionsTimeout&lt;/code&gt; (default value 6 seconds)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;collectionsPollingInterval&lt;/code&gt; (default value 0.2 seconds)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Typically collections are loaded longer than single elements (they contain more than one element).
That&amp;rsquo;s why they need longer timeout.&lt;/p&gt;</description></item><item><title>Released Selenide 3.2</title><link>https://selenide.org/2016/01/29/selenide-3.2/</link><pubDate>Fri, 29 Jan 2016 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2016/01/29/selenide-3.2/</guid><description>&lt;p&gt;Good morning!&lt;/p&gt;
&lt;p&gt;We released Selenide 3.2&lt;/p&gt;
&lt;h2 id="now-selenide-logs-browser-version"&gt;Now Selenide logs browser version&lt;/h2&gt;
&lt;p&gt;We added INFO log containing version of browser, Selenium and Selenide:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code&gt;00:32:45 INFO BrowserName=chrome Version=48.0.2564.109 Platform=MAC
00:32:45 INFO Selenide v. 3.2
00:32:45 INFO Selenium WebDriver v. 2.51.0 build time: 2016-02-05 11:20:57&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="better-report"&gt;Better report&lt;/h2&gt;
&lt;p&gt;We renamed FAILED-&amp;gt;FAIL, PASSED-&amp;gt;PASS in selenide report. So they don&amp;rsquo;t mess with &lt;code&gt;PASSED&lt;/code&gt; and &lt;code&gt;FAILED&lt;/code&gt; that are typically
written by Maven and other tools.
Now it&amp;rsquo;s a little bit easier to analyze Selenide output in Jenkins.&lt;/p&gt;</description></item><item><title>Released Selenide 3.1</title><link>https://selenide.org/2016/01/17/selenide-3.1/</link><pubDate>Sun, 17 Jan 2016 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2016/01/17/selenide-3.1/</guid><description>&lt;p&gt;Good evening!&lt;/p&gt;
&lt;p&gt;Good new year news: we released Selenide 3.1.&lt;/p&gt;
&lt;h2 id="updated-documentation"&gt;Updated documentation&lt;/h2&gt;
&lt;p&gt;We fixed and updated &lt;a href="https://selenide.org/documentation.html"&gt;documentation&lt;/a&gt; on site.&lt;/p&gt;
&lt;p&gt;Thanks to &lt;a href="https://github.com/vinogradoff"&gt;Aleksei Vinogradov&lt;/a&gt; and Erik Khalimov for hard work!&lt;/p&gt;
&lt;h2 id="method-download-does-not-allow-invisible-links"&gt;Method &lt;code&gt;$().download()&lt;/code&gt; does not allow invisible links&lt;/h2&gt;
&lt;p&gt;Before Selenide 3.1, method &lt;code&gt;$().download()&lt;/code&gt; allowed to download files from invisible links.
We fixed this &lt;a href="https://github.com/selenide/selenide/issues/263"&gt;bug&lt;/a&gt;.
Thanks to &lt;a href="https://github.com/dimand58"&gt;@dimand58&lt;/a&gt; for this &lt;a href="https://github.com/selenide/selenide/pull/264"&gt;pull request&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="methods-switchto-now-can-wait-if-needed"&gt;Methods &lt;code&gt;switchTo(...)&lt;/code&gt; now can wait if needed&lt;/h2&gt;
&lt;p&gt;Methods &lt;code&gt;switchTo(alert())&lt;/code&gt;, &lt;code&gt;switchTo(frame())&lt;/code&gt;, &lt;code&gt;switchTo(window())&lt;/code&gt; got smarter. Now they can wait a little bit, if
&lt;a href="https://github.com/selenide/selenide/issues/206"&gt;alert&lt;/a&gt;, &lt;a href="https://github.com/selenide/selenide/issues/206"&gt;frame&lt;/a&gt;
or &lt;a href="https://github.com/selenide/selenide/issues/271"&gt;window&lt;/a&gt; is not loaded yet. As usually, default timeout is 4 seconds.&lt;/p&gt;</description></item><item><title>Changes in Selenide 2.25</title><link>https://selenide.org/2015/11/30/selenide-2.25/</link><pubDate>Mon, 30 Nov 2015 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2015/11/30/selenide-2.25/</guid><description>&lt;p&gt;Good evening!&lt;/p&gt;
&lt;p&gt;Today we released Selenide 2.25. It&amp;rsquo;s the last Selenide version in 2.* line.
A big refactoring, clean-up of deprecated stuff and Selenide 3.0 follows soon.&lt;/p&gt;
&lt;p&gt;Please review your tests and be sure you don&amp;rsquo;t use any @Deprecated methods. We are going to remove them in Selenide 3.0.&lt;/p&gt;
&lt;p&gt;But now - Selenide 2.25 highlights:&lt;/p&gt;
&lt;h2 id="we-added-selenide-profiler-for-testng"&gt;We added &amp;ldquo;Selenide profiler&amp;rdquo; for TestNG&lt;/h2&gt;
&lt;p&gt;You probably know that Selenide suggests a profiler for your tests named &lt;a href="https://selenide.org/2015/05/05/selenide-2.16-and-2.17/"&gt;PrettyReportCreator&lt;/a&gt;.
It was only available for JUnit until now. Now we created the same profiler for TestNG.&lt;/p&gt;</description></item><item><title>Released Selenide 3.0</title><link>https://selenide.org/2015/11/30/selenide-3.0/</link><pubDate>Mon, 30 Nov 2015 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2015/11/30/selenide-3.0/</guid><description>&lt;p&gt;Hello!&lt;/p&gt;
&lt;p&gt;We released Selenide 3.0. Finally!&lt;/p&gt;
&lt;p&gt;NB! Selenide 3.0 is a major upgrade, meaning that something can become broken.&lt;/p&gt;
&lt;p&gt;Don&amp;rsquo;t be afraid: if you used only public API and didn&amp;rsquo;t used @Deprecated methods, then nothing changes for you.
But if you did, read carefully.&lt;/p&gt;
&lt;h2 id="historical-notes"&gt;Historical notes&lt;/h2&gt;
&lt;p&gt;The first version Selenide 1.0 was created in year 2011. We silently tested and tuned it for more than a year.&lt;/p&gt;
&lt;p&gt;In March 2013 we went to SeleniumCamp conference in Kiev and released Selenide 2.0 there.
In 2.0 we cleaned up all the legacy and left only the new API.
Then was the first &amp;ldquo;public&amp;rdquo; version of Selenide 2.0 born.
At that moment, &lt;code&gt;SelenideElement&lt;/code&gt; has only a dozen of methods and was called &lt;code&gt;ShouldableWebElement&lt;/code&gt;. :)&lt;/p&gt;</description></item><item><title>Selenide changes license to MIT</title><link>https://selenide.org/2015/11/16/selenide-changes-license-to-mit/</link><pubDate>Mon, 16 Nov 2015 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2015/11/16/selenide-changes-license-to-mit/</guid><description>&lt;p&gt;Good evening!&lt;/p&gt;
&lt;p&gt;We decided to change Selenide license from LGPL to MIT.&lt;/p&gt;
&lt;p&gt;Shortly said, it means that you can do with Selenide &lt;em&gt;whatever&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;MIT is &lt;strong&gt;the most permissive license&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://choosealicense.com/"&gt;Here you can find&lt;/a&gt; illustration for differences between most common open-source licenses MIT, Apache and GPL.&lt;/p&gt;
&lt;h3 id="why-not-lgpl"&gt;Why not LGPL?&lt;/h3&gt;
&lt;p&gt;Actually we like LGPL. LGPL means that you must publish your code as open-source &lt;strong&gt;only if&lt;/strong&gt; you include Selenide
code into your product. But you use Selenide in tests, so you don&amp;rsquo;t include Selenide
into code that is delivered to your customers. That&amp;rsquo;s why you don&amp;rsquo;t need to publish your source code.&lt;/p&gt;</description></item><item><title>Selenide presentation on Devoxx 2015</title><link>https://selenide.org/2015/11/13/selenide-on-devoxx/</link><pubDate>Fri, 13 Nov 2015 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2015/11/13/selenide-on-devoxx/</guid><description>&lt;p&gt;Now in Europe!&lt;/p&gt;
&lt;p&gt;I have presented Selenide on Devoxx - the biggest Java conference in Europe.&lt;/p&gt;
&lt;p&gt;Here is video of my talk:&lt;/p&gt;
&lt;div class="wrapper-content center"&gt;
&lt;iframe width="840" height="473" src="https://www.youtube.com/embed/BjEW08vDUfI" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;And slides:&lt;/p&gt;
&lt;div class="wrapper-content center"&gt;
&lt;iframe src="https://docs.google.com/presentation/d/1qA_0wC2pV9IQZu3DoLwm8yGQ_9DlM1WdNzUYgAWFGiQ/embed?start=false&amp;loop=false&amp;delayms=3000" frameborder="0" width="960" height="569" allowfullscreen="allowfullscreen" mozallowfullscreen="true" webkitallowfullscreen="true"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;br/&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/channel/UCCBVCTuk6uJrN3iFV_3vurg"&gt;Here&lt;/a&gt; you can find other Devoxx 2015 videos.&lt;/p&gt;
&lt;p&gt;Andrei Solntsev&lt;/p&gt;
&lt;p&gt;selenide.org&lt;/p&gt;</description></item><item><title>Changes in Selenide 2.24</title><link>https://selenide.org/2015/11/08/selenide-2.24/</link><pubDate>Sun, 08 Nov 2015 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2015/11/08/selenide-2.24/</guid><description>&lt;p&gt;Good morning!
We released Selenide 2.24. It&amp;rsquo;s a minor release.&lt;/p&gt;
&lt;h2 id="upgraded-to-selenium-java-2482"&gt;Upgraded to selenium-java 2.48.2&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://raw.githubusercontent.com/SeleniumHQ/selenium/master/java/CHANGELOG"&gt;changelog of selenium 2.48.2&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="add-method-pressescape"&gt;Add method &lt;code&gt;$.pressEscape()&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;In addition to methods&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;input&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;pressEnter&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;input&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;pressTab&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;we have now new method:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;input&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;pressEscape&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fixed-soft-asserts-for-testng"&gt;Fixed soft asserts for TestNG&lt;/h2&gt;
&lt;p&gt;As you probably know Selenide has &lt;a href="http://ru.selenide.org/2015/05/05/selenide-2.16-and-2.17/"&gt;soft asserts&lt;/a&gt; functionality.
Some time ago it was broken if you run tests in TestNG. Now we fixed it.&lt;/p&gt;
&lt;h2 id="logic-of-webdriver-creation-extracted-to-a-separate-class-webdriverfactory"&gt;Logic of webdriver creation extracted to a separate class WebDriverFactory&lt;/h2&gt;
&lt;p&gt;Before this release, class &lt;code&gt;WebDriverRunner&lt;/code&gt; created browsers. But it grew to be too large: it also detects hanging
browsers, closes and reopens browsers etc. That&amp;rsquo;s why we extracted logic of &lt;strong&gt;creating&lt;/strong&gt; webdrivers to a separate class.&lt;/p&gt;</description></item><item><title>Introduction to Selenide on SeleniumConf 2015</title><link>https://selenide.org/2015/09/23/selenide-on-seleniumconf/</link><pubDate>Wed, 23 Sep 2015 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2015/09/23/selenide-on-seleniumconf/</guid><description>&lt;p&gt;Finally!&lt;/p&gt;
&lt;p&gt;I have got a change to introduce Selenide on SeleniumConf conference that took place in Portland this year.&lt;/p&gt;
&lt;p&gt;Here is video of my talk:&lt;/p&gt;
&lt;div class="wrapper-content center"&gt;
&lt;iframe width="840" height="473" src="https://www.youtube.com/embed/fR8CyLcxBZ0" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;And slides:&lt;/p&gt;
&lt;div class="wrapper-content center"&gt;
&lt;iframe src="https://docs.google.com/presentation/d/1ZksjuL2vPN_pkhMuon0HH4gm7KNmjU50pByRRGzgVko/embed?start=false&amp;loop=false&amp;delayms=3000" frameborder="0" width="960" height="569" allow="fullscreen" mozallowfullscreen="true" webkitallowfullscreen="true"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;br/&gt;
&lt;p&gt;&lt;a href="http://confengine.com/selenium-conf-2015/schedule"&gt;Here&lt;/a&gt; you can find other SeleniumConf videos.&lt;/p&gt;
&lt;p&gt;Andrei Solntsev&lt;/p&gt;
&lt;p&gt;selenide.org&lt;/p&gt;</description></item><item><title>Changes in Selenide 2.23</title><link>https://selenide.org/2015/09/15/selenide-2.23/</link><pubDate>Tue, 15 Sep 2015 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2015/09/15/selenide-2.23/</guid><description>&lt;p&gt;Hi all!&lt;/p&gt;
&lt;p&gt;In september we released Selenide 2.23. Let&amp;rsquo;s take a look on news.&lt;/p&gt;
&lt;h2 id="new-method-selectradio"&gt;New method &lt;code&gt;$.selectRadio()&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;In order to select radio button, Selenide had a method&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Selenide&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;selectRadio&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="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;gender&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;male&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now we have new method that is more consistent with other Selenide methods:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;$&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="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;gender&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="na"&gt;selectRadio&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;male&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;As other Selenide methods, it can wait if the radio button is not available yet.&lt;/p&gt;
&lt;h2 id="method-setvalue-can-now-handle-radio-buttons"&gt;Method &lt;code&gt;$.setValue()&lt;/code&gt; can now handle radio buttons&lt;/h2&gt;
&lt;p&gt;We try to make Selenide as universal as possible, so that you would not need to think about low-level technical details
of web elements. For instance, method &lt;code&gt;$.setValue()&lt;/code&gt; detects what type of web element you are operating with:
&lt;code&gt;input&lt;/code&gt;, &lt;code&gt;select&lt;/code&gt; or &lt;code&gt;textarea&lt;/code&gt; - and behaves correspondingly.&lt;/p&gt;</description></item><item><title>Changes in Selenide 2.21 and 2.22</title><link>https://selenide.org/2015/08/29/selenide-2.22/</link><pubDate>Sat, 29 Aug 2015 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2015/08/29/selenide-2.22/</guid><description>&lt;p&gt;Good saturday!&lt;/p&gt;
&lt;p&gt;Recently we released Selenide 2.21 and 2.22. They contain few but important changes.&lt;/p&gt;
&lt;h2 id="upgrade-to-java-7"&gt;Upgrade to Java 7&lt;/h2&gt;
&lt;p&gt;Starting from version 2.21, Selenide only works on Java 7 and higher.&lt;/p&gt;
&lt;p&gt;If you used Java 6, it&amp;rsquo;s time to upgrade.&lt;/p&gt;
&lt;h2 id="upgrade-to-selenium-2471"&gt;Upgrade to Selenium 2.47.1&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;It requires Java 7.&lt;/li&gt;
&lt;li&gt;It supports native events only for FireFox 31. For later FireFox versions only synthetic events are supported.&lt;/li&gt;
&lt;li&gt;It adds experimental support for the new browser &amp;ldquo;Microsoft Edge&amp;rdquo;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://github.com/SeleniumHQ/selenium/blob/master/dotnet/CHANGELOG"&gt;All changes in Selenium 2.47.1&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Changes in Selenide 2.20</title><link>https://selenide.org/2015/07/27/selenide-2.20/</link><pubDate>Mon, 27 Jul 2015 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2015/07/27/selenide-2.20/</guid><description>&lt;p&gt;Hi all!&lt;/p&gt;
&lt;p&gt;We have released Selenide 2.20. Let me tell you what&amp;rsquo;s new there.&lt;/p&gt;
&lt;h2 id="protection-against-webdriver-hanging"&gt;Protection against webdriver hanging&lt;/h2&gt;
&lt;p&gt;Sometimes we experience problems with webdriver: it hangs when trying to open or close browser.
This thread just remains endlessly in the same state: &amp;ldquo;Forwarding newSession on session null to remote&amp;rdquo;.
I guess it&amp;rsquo;s a bug in webdriver.&lt;/p&gt;
&lt;p&gt;We added protection against this problem in Selenide 2.20.&lt;/p&gt;
&lt;p&gt;Now Selenide runs opening/closing browser in a separate thread and limits its time. By default opening browser cannot take more than 15 seconds, and closing browser cannot take more than 5 seconds.
In case of failure, Selenide re-tries (up to 3 times) and only then throws an exception.&lt;/p&gt;</description></item><item><title>Changes in Selenide 2.19</title><link>https://selenide.org/2015/06/21/selenide-2.19/</link><pubDate>Sun, 21 Jun 2015 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2015/06/21/selenide-2.19/</guid><description>&lt;p&gt;Hi everybody!&lt;/p&gt;
&lt;p&gt;We have released Selenide 2.19.&lt;/p&gt;
&lt;p&gt;Several problems have been fixed, primarily with inner frames and self-signed certificates.&lt;/p&gt;
&lt;h2 id="working-with-inner-frames"&gt;Working with inner frames&lt;/h2&gt;
&lt;p&gt;One of the most problematic objects for automated testing is &lt;strong&gt;frames&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Selenium Webdriver can switch to frame. But there are also inner frames in the field! Webdriver cannot switch into
inner frame. Poor testers need to switch to parent frame, then to child frame, then to grandchild frame, etc.&lt;/p&gt;</description></item><item><title>Changes in Selenide 2.18</title><link>https://selenide.org/2015/05/06/selenide-2.18/</link><pubDate>Wed, 06 May 2015 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2015/05/06/selenide-2.18/</guid><description>&lt;p&gt;Good evening!&lt;/p&gt;
&lt;p&gt;In the end of April we released long-waited Selenide 2.18.
It was hard. We have totally rewritten waiting algorithm, so now it catches all the StaleElementException.&lt;/p&gt;
&lt;p&gt;Let me describe it in details.&lt;/p&gt;
&lt;h2 id="waiting-algorithm"&gt;Waiting algorithm&lt;/h2&gt;
&lt;p&gt;Selenide always fought against StaleElementException and other problems caused by Ajax and timeouts.
But it was still possible to get StaleElementException in rare cases.&lt;/p&gt;
&lt;p&gt;In Selenide 2.18 we reworked waiting mechanism.&lt;/p&gt;
&lt;p&gt;The old algorithm was the following:&lt;/p&gt;</description></item><item><title>Changes in Selenide 2.16 and 2.17</title><link>https://selenide.org/2015/05/05/selenide-2.16-and-2.17/</link><pubDate>Tue, 05 May 2015 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2015/05/05/selenide-2.16-and-2.17/</guid><description>&lt;p&gt;Hi Seleniders!&lt;/p&gt;
&lt;p&gt;We haven&amp;rsquo;t written to blog for a while. There have been released 3 new versions of Selenide during this period.&lt;/p&gt;
&lt;p&gt;Let me describe changes in versions 2.16 and 2.17&lt;/p&gt;
&lt;h3 id="soft-asserts"&gt;Soft asserts&lt;/h3&gt;
&lt;p&gt;We finally added SoftAsserts to Selenide. I am still not sure that it&amp;rsquo;s a good idea, but it was asked a lot. :)&lt;/p&gt;
&lt;p&gt;In SoftAssert mode your tests do not fail immediately, but all the checks like &lt;code&gt;$.shouldHave(text(&amp;quot;xxx&amp;quot;))&lt;/code&gt;
will collect errors and report all them at once in the end of test.
It allows you to collect all the fails, fix them all and re-run test only once. It could be useful if
cost of running tests is too big for you.&lt;/p&gt;</description></item><item><title>How to test GMail</title><link>https://selenide.org/2014/12/28/how-to-test-gmail/</link><pubDate>Sun, 28 Dec 2014 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2014/12/28/how-to-test-gmail/</guid><description>&lt;p&gt;Hi all!&lt;/p&gt;
&lt;p&gt;How would you test GMail if you were Google developer?
It&amp;rsquo;s a great exercise, try it once!&lt;/p&gt;
&lt;p&gt;Automated testing of GMail is not trivial. It heavily uses ajax, elements are loaded dynamically, loading may take
more than few seconds, and there is no reasonable IDs/selectors. You would need to add &amp;ldquo;wait&amp;rdquo; for almost every operator!&lt;/p&gt;
&lt;h3 id="project-gmail-test"&gt;Project &amp;ldquo;GMail test&amp;rdquo;&lt;/h3&gt;
&lt;p&gt;But it&amp;rsquo;s possible!
In &lt;a href="https://github.com/selenide-examples"&gt;Selenide Examples&lt;/a&gt; series we present a
&lt;a href="https://github.com/selenide-examples/gmail"&gt;github project for testing GMail&lt;/a&gt;. It checks inbox content and composes a
new message. Then it clicks &amp;ldquo;Undo&amp;rdquo;, edits the message body and sends it again.
And finally waits until the &amp;ldquo;Undo&amp;rdquo; button disappears.&lt;/p&gt;</description></item><item><title>How to allocate time for refactoring?</title><link>https://selenide.org/2014/12/17/time-for-refactoring/</link><pubDate>Wed, 17 Dec 2014 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2014/12/17/time-for-refactoring/</guid><description>&lt;p&gt;One of the most common IT questions is: &lt;em&gt;How to allocate time for refactoring&lt;/em&gt;?&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s common for both developers and testers. Both get very quickly a heap of dirty unreadable code, a plenty of
slow, unmaintainable, unreadable tests. It&amp;rsquo;s getting harder and harder to live with it.
Development/testing is getting slower. Motivation decreases. Sometimes you happen to clean up
some lines in the evening time, but&amp;hellip; it seems to be something wrong with the evening-time work?..&lt;/p&gt;</description></item><item><title>The fast and the continuous @ SQA Days 16</title><link>https://selenide.org/2014/12/13/the-fast-and-the-continuous/</link><pubDate>Sat, 13 Dec 2014 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2014/12/13/the-fast-and-the-continuous/</guid><description>&lt;p&gt;This is a video from my presentation &lt;a href="http://sqadays.com/ru/talk/25882"&gt;&amp;ldquo;The fast and the continuous&amp;rdquo;&lt;/a&gt; on the last SQA Days 16 conference in Saint-Petersburg (Russia).&lt;/p&gt;
&lt;p&gt;The video is in Russian.&lt;/p&gt;
&lt;iframe src="//player.vimeo.com/video/114339032" width="800" height="256" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt; &lt;p&gt;&lt;a href="https://vimeo.com/114339032"&gt;The fast and the continuous&lt;/a&gt; from &lt;a href="https://vimeo.com/orlikov"&gt;Vlad Orlikov&lt;/a&gt; on &lt;a href="https://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Video of Andrei Solntsev presentation on SQA Days-16&lt;br /&gt; November 14-15 2014, Saint-Petersburg, Russia&lt;br /&gt; www.sqadays.com&lt;/p&gt;
&lt;br/&gt;</description></item><item><title>You find wrong bugs</title><link>https://selenide.org/2014/12/09/you-find-wrong-bugs/</link><pubDate>Tue, 09 Dec 2014 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2014/12/09/you-find-wrong-bugs/</guid><description>&lt;p&gt;When I was on the last SQA Days conference in Saint-Petersburg, there happened an incident.
At that moment, I didn&amp;rsquo;t realize what happened. I just smiled. And only a few days later I got the idea.&lt;/p&gt;
&lt;h3 id="so"&gt;So,&lt;/h3&gt;
&lt;p&gt;when I finished &lt;a href="http://sqadays.com/ru/talk/25882"&gt;my speech&lt;/a&gt; about really effective automated testing, a man
took a microphone and started asking criticizing questions. After a few answers of mine, he sat down discordant, saying:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You find wrong bugs.&lt;/p&gt;</description></item><item><title>Changes in Selenide 2.15</title><link>https://selenide.org/2014/11/03/selenide-2.15/</link><pubDate>Mon, 03 Nov 2014 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2014/11/03/selenide-2.15/</guid><description>&lt;p&gt;Good evening!&lt;/p&gt;
&lt;p&gt;Good news: we have released Selenide 2.15. This time we have a lot of new features.&lt;/p&gt;
&lt;h3 id="sizzle-selectors-css3"&gt;Sizzle selectors (CSS3)&lt;/h3&gt;
&lt;p&gt;Now you can use &lt;a href="http://sizzlejs.com/"&gt;CSS3 selectors&lt;/a&gt; in Selenide for searching web elements!&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;:contains(&amp;#39;Tere Martin!&amp;#39;)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;shouldBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;visible&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;:not(a#id)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;$$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;:not(div,p)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;shouldHave&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;3&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;[value!=&amp;#39;johnny&amp;#39;]&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;div:has(span)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;:input&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;:text&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;:checkbox&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;:file&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;:password&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;:image&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;:header&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;:first&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;:last&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;:even&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To enable Sizzle selectors, add this line to your tests:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Configuration&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;selectorMode&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Sizzle&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Feel free to share your experience with us. Did it work for you?&lt;/p&gt;</description></item><item><title>How to start writing UI tests in 10 minutes</title><link>https://selenide.org/2014/10/01/how-to-start-writing-ui-tests/</link><pubDate>Wed, 01 Oct 2014 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2014/10/01/how-to-start-writing-ui-tests/</guid><description>&lt;p&gt;Hi!&lt;/p&gt;
&lt;p&gt;People often ask: how to learn writing tests? How to start? How to write first test in Selenium?&lt;/p&gt;
&lt;p&gt;Now we have an answer!&lt;/p&gt;
&lt;p&gt;This video tutorial demonstrates how to create a project with Maven and write a test that opens a Google in browser,
enters a word and checks for search results.&lt;/p&gt;
&lt;center&gt;
&lt;iframe src="//player.vimeo.com/video/107647158" width="800" height="450" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt; &lt;p&gt;&lt;a href="https://vimeo.com/107647158"&gt;How to start writing UI tests in 10 minutes&lt;/a&gt; from &lt;a href="https://vimeo.com/user20427140"&gt;Selenide&lt;/a&gt; on &lt;a href="https://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Selenide tutorial&lt;/p&gt;
&lt;/center&gt;
&lt;p&gt;Please feel free to &lt;a href="https://selenide.org/contacts.html"&gt;give your feedback&lt;/a&gt;!&lt;/p&gt;</description></item><item><title>Changes in 2.13 and 2.14</title><link>https://selenide.org/2014/09/28/selenide-2.13-and-2.14/</link><pubDate>Sun, 28 Sep 2014 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2014/09/28/selenide-2.13-and-2.14/</guid><description>&lt;p&gt;Hi Seleniders!&lt;/p&gt;
&lt;p&gt;In September we released two versions of Selenide: 2.13 and 2.14. There is not so much new functions, but there is
one new function that I want to discuss with you. Let&amp;rsquo;s start with it.&lt;br/&gt; &lt;br/&gt;&lt;/p&gt;
&lt;h3 id="fast-method-setvalue"&gt;Fast method $.setValue&lt;/h3&gt;
&lt;p&gt;In Codeborne we analyzed performance of tests in few real projects and discovered that the most slow part of
tests is filling text fields (not XPath search as many of us think). In other words, method &lt;code&gt;$.setValue&lt;/code&gt; (or
&lt;code&gt;WebElement.sendKeys&lt;/code&gt;) is the bottleneck. It&amp;rsquo;s because Selenium emulates keypress of every single key with all related
events: keyDown, keyUp etc. - thus making method &lt;code&gt;sendKeys&lt;/code&gt; quite slow. &lt;br/&gt; &lt;br/&gt;&lt;/p&gt;</description></item><item><title>Selenide usage simple notes: IE, TestNG, Bootstrap dropdown</title><link>https://selenide.org/2014/08/25/selenide-usage-notes/</link><pubDate>Mon, 25 Aug 2014 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2014/08/25/selenide-usage-notes/</guid><description>&lt;p&gt;Hello!&lt;/p&gt;
&lt;p&gt;My name is Sergey Shimkiv. Below you can find some notes about Selenide/Selenium usage. &lt;br/&gt; &lt;br/&gt;&lt;/p&gt;
&lt;h3 id="ie-notes"&gt;IE notes&lt;/h3&gt;
&lt;p&gt;IE 11 x32/x64. In some cases after the actions with HTML elements (&lt;code&gt;click()&lt;/code&gt; for example) you can receive an exception. &lt;br /&gt;
The cause of it could be synthetic events usage. The workaround is to use native events for IE:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;capabilities&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setCapability&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;nativeEvents&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;See &lt;a href="https://code.google.com/p/selenium/wiki/InternetExplorerDriver"&gt;https://code.google.com/p/selenium/wiki/InternetExplorerDriver&lt;/a&gt;&lt;/p&gt;
&lt;br/&gt;
&lt;h3 id="one-way-to-add-selenide-screenshot-into-the-testng-html-reporter"&gt;One way to add Selenide screenshot into the TestNG HTML reporter&lt;/h3&gt;
&lt;p&gt;In some cases you might want to add Selenide&amp;rsquo;s screenshots of failed tests into your TestNG HTML reporter.&lt;/p&gt;</description></item><item><title>Shorten your code</title><link>https://selenide.org/2014/08/08/shorten-your-code/</link><pubDate>Fri, 08 Aug 2014 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2014/08/08/shorten-your-code/</guid><description>&lt;p&gt;Hi all!&lt;/p&gt;
&lt;p&gt;This is &lt;em&gt;Prezi&lt;/em&gt; presentation about Selenide from &lt;a href="http://prezi.com/user/-yv8ll42j1_i/"&gt;Ashwin Dalvi&lt;/a&gt;.&lt;/p&gt;
&lt;br/&gt;
&lt;br/&gt;
&lt;h3 id="pros-cons-and-myths"&gt;Pros, Cons and Myths:&lt;/h3&gt;
&lt;iframe src="http://prezi.com/embed/d18jggopjyaj/?bgcolor=ffffff&amp;amp;lock_to_path=0&amp;amp;autoplay=0&amp;amp;autohide_ctrls=0&amp;amp;features=undefined&amp;amp;disabled_features=undefined&amp;amp;html5=1" width="800" height="600" frameBorder="0" webkitAllowFullScreen mozAllowFullscreen allowfullscreen&gt;&lt;/iframe&gt;
&lt;br/&gt;
&lt;p&gt;Selenide: Shorten your code!&lt;/p&gt;
&lt;br/&gt;</description></item><item><title>Changes in Selenide 2.12</title><link>https://selenide.org/2014/07/05/selenide-2.12/</link><pubDate>Sat, 05 Jul 2014 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2014/07/05/selenide-2.12/</guid><description>&lt;p&gt;Hello QA geeks!&lt;/p&gt;
&lt;p&gt;Great news: we have released Selenide 2.12. Let&amp;rsquo;s see what&amp;rsquo;s coming with it. &lt;br/&gt; &lt;br/&gt;&lt;/p&gt;
&lt;h3 id="added-function-uploadfilefile"&gt;Added function $.uploadFile(File)&lt;/h3&gt;
&lt;p&gt;The function allows you to upload a file.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cv&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;src/test/resources/cv.pdf&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;#cvFileUpload&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;uploadFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cv&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Selenide already had a similar function &lt;code&gt;$.uploadFromClasspath(String fileName)&lt;/code&gt;. It searched the file for uploading in classpath.
We believe that holding test file together with test sources is a good practice (meaning that test files get to classpath during project compilation).&lt;/p&gt;</description></item><item><title>Changes in Selenide 2.11</title><link>https://selenide.org/2014/05/23/selenide-2.11/</link><pubDate>Fri, 23 May 2014 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2014/05/23/selenide-2.11/</guid><description>&lt;p&gt;Hello!&lt;/p&gt;
&lt;p&gt;We have released Selenide 2.11. It does contains no new features, but removes old unused features, that made our
life complex and broke down the progress. &lt;br/&gt; &lt;br/&gt;&lt;/p&gt;
&lt;p&gt;Please be so nice and run your tests with Selenide 2.11. Notify us if some tests got broken. &lt;br/&gt; &lt;br/&gt;&lt;/p&gt;
&lt;h2 id="what-we-cleaned-up"&gt;What we cleaned up&lt;/h2&gt;
&lt;h3 id="removed-dependency-on-jquery"&gt;Removed dependency on jQuery&lt;/h3&gt;
&lt;p&gt;Methods $.selectOption() and $.selectOptionByValue() tried to trigger &amp;ldquo;change&amp;rdquo; event using jQuery.
It was done a long time ago to fight against some odd test failures on Windows in IE. Now it&amp;rsquo;s actual anymore&lt;/p&gt;</description></item><item><title>Changes in Selenide 2.10</title><link>https://selenide.org/2014/04/27/selenide-2.10/</link><pubDate>Sun, 27 Apr 2014 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2014/04/27/selenide-2.10/</guid><description>&lt;p&gt;Hi all!&lt;/p&gt;
&lt;p&gt;Recently we released Selenide 2.10. Let me introduce you the news!&lt;/p&gt;
&lt;h2 id="new-functions"&gt;New functions&lt;/h2&gt;
&lt;h3 id="working-with-windowstabs"&gt;Working with windows/tabs&lt;/h3&gt;
&lt;p&gt;Selenium WebDriver does not support convenient API for working with windows and tabs.
It only suggests method &lt;code&gt;getWindowHandles()&lt;/code&gt; that returns set of strings - identifiers of opened windows.
It&amp;rsquo;s not trivial to find the needed one from these handles.
&lt;br/&gt;
&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;As Selenide primary goal is to free developer&amp;rsquo;s head from browser technical details, we want to make working with
windows/tabs easy and intuitive. We started this movement from a simple thing: we have added method&lt;/p&gt;</description></item><item><title>Changes in Selenide 2.9</title><link>https://selenide.org/2014/03/15/selenide-2.9/</link><pubDate>Sat, 15 Mar 2014 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2014/03/15/selenide-2.9/</guid><description>&lt;p&gt;Good evening!&lt;/p&gt;
&lt;p&gt;Today was released Selenide 2.9. Let me tell you about the changes in the new version.&lt;/p&gt;
&lt;h2 id="new-functionality"&gt;New functionality&lt;/h2&gt;
&lt;h3 id="added-support-for-safari-browser"&gt;Added support for Safari browser&lt;/h3&gt;
&lt;p&gt;Indeed, Safari driver doesn&amp;rsquo;t seem to be stable yet. At least, some Selenide tests still fail on Safari.&lt;/p&gt;
&lt;p&gt;Another problem with Safari is that it doesn&amp;rsquo;t support JS alerts and cannot open local files like &lt;code&gt;file://c:/tmp.txt&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Please feel free to share your experience with Safari webdriver!&lt;/p&gt;</description></item><item><title>Selenide downloads: over 200 unique ips</title><link>https://selenide.org/2014/03/12/selenide-downloads/</link><pubDate>Wed, 12 Mar 2014 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2014/03/12/selenide-downloads/</guid><description>&lt;p&gt;As you probably know, the Central Maven Repo publishes download statistics for different artifacts.&lt;/p&gt;
&lt;br/&gt;
&lt;p&gt;Today was published Selenide download statistics for February, 2014.
The image below shows number of unique IPs that downloaded selenide.jar from the central maven repository.&lt;/p&gt;
&lt;br/&gt;
&lt;p&gt;It seems that we have great success! Yeah!&lt;/p&gt;
&lt;br/&gt;
&lt;center&gt;
&lt;img src="https://selenide.org/images/2014/03/selenide_downloads.unique_ips.png" width="800"/&gt;
&lt;/center&gt;
&lt;br/&gt;</description></item><item><title>Selenide in five minutes by Glen Smith</title><link>https://selenide.org/2014/03/11/selenide-in-5-minutes/</link><pubDate>Tue, 11 Mar 2014 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2014/03/11/selenide-in-5-minutes/</guid><description>&lt;p&gt;Wow!&lt;/p&gt;
&lt;p&gt;Glen Smith presented Selenide at Canberra JUG.
This is a really great 5-min live demo of Selenide. It took only 5 minutes to tell, write and run a
full working test for google image service. You know, it&amp;rsquo;s not that easy: there is Ajax under the hood&amp;hellip;&lt;/p&gt;
&lt;br/&gt;
&lt;p&gt;Please enjoy!&lt;/p&gt;
&lt;br/&gt;
&lt;center&gt;
&lt;iframe src="//www.youtube.com/embed/6LW4h5y6Iw4" height="473" width="630" allowfullscreen="" frameborder="0"&gt;&lt;/iframe&gt;
&lt;br/&gt;
&lt;p&gt;Original blog post: &lt;a href="http://blogs.bytecode.com.au/glen/2014/02/13/selenide-in-five-minutes-a-lightning-talk.html"&gt;Selenide in Five Minutes: A lightning talk&lt;/a&gt;&lt;/p&gt;
&lt;/center&gt;
&lt;br/&gt;
&lt;p&gt;&lt;a href="http://blogs.bytecode.com.au/glen/about"&gt;Glen Smith&lt;/a&gt; is an Australian engineer, co-author of &amp;ldquo;Grails in Action&amp;rdquo; book.&lt;/p&gt;</description></item><item><title>Selenide T-shirt</title><link>https://selenide.org/2013/10/04/selenide-tshirt/</link><pubDate>Fri, 04 Oct 2013 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2013/10/04/selenide-tshirt/</guid><description>&lt;p&gt;Hi seleniders!&lt;/p&gt;
&lt;p&gt;You could have noticed that Selenide has got a new logo and design.&lt;/p&gt;
&lt;p&gt;And even own T-shirts! Like real men!&lt;/p&gt;
&lt;p&gt;We will share three of these T-shirts next week on the &lt;a href="http://xpdays.com.ua/program/"&gt;XP Days conference&lt;/a&gt; in Kiev.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://selenide.org/images/2013/10/selenide_front.jpg"&gt;&lt;img src="https://selenide.org/images/2013/10/selenide_front.thumb.jpg" alt="front"&gt;&lt;/a&gt;
&lt;a href="https://selenide.org/images/2013/10/selenide_back.jpg"&gt;&lt;img src="https://selenide.org/images/2013/10/selenide_back.thumb.jpg" alt="back"&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Selenide Harlem Shake</title><link>https://selenide.org/2013/08/29/selenide-harlem-shake/</link><pubDate>Thu, 29 Aug 2013 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2013/08/29/selenide-harlem-shake/</guid><description>&lt;p&gt;Good morning!&lt;/p&gt;
&lt;p&gt;This is a video demonstrating how easy is to start writing automated tests with Selenide.&lt;/p&gt;
&lt;p&gt;We wanted to make a screencast that would be short, funny and informative enough. By the way, this is a real-life project, not another &amp;ldquo;Hello World&amp;rdquo; application.&lt;/p&gt;
&lt;p&gt;Watch with sound!&lt;/p&gt;
&lt;iframe src="//player.vimeo.com/video/73128965" width="500" height="281" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""&gt;
&lt;/iframe&gt;
&lt;p&gt;
 &lt;a href="https://vimeo.com/73128965"&gt;Selenide Harlem Shake&lt;/a&gt; from
 &lt;a href="https://vimeo.com/user20427140"&gt;Selenide&lt;/a&gt; on
 &lt;a href="https://vimeo.com"&gt;Vimeo&lt;/a&gt;.
&lt;/p&gt;</description></item><item><title>Can PhantomJS take screenshots?</title><link>https://selenide.org/2013/07/15/can-phantomjs-take-screenshots/</link><pubDate>Mon, 15 Jul 2013 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2013/07/15/can-phantomjs-take-screenshots/</guid><description>&lt;p&gt;Many people think that PhantomJS (as a headless browser) cannot take screenshots.&lt;/p&gt;
&lt;p&gt;This is not true!&lt;/p&gt;
&lt;p&gt;According to &lt;a href="https://github.com/ariya/phantomjs/wiki/Screen-Capture"&gt;PhantomJS documentation&lt;/a&gt;, it can take screenshots.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s try to do that.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import static&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;com.codeborne.selenide.Selenide.*&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TestPhantomScreenshot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;static&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;browser&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;phantomjs&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;http://google.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;screenshot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;google-com-screenshot&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It works!&lt;/p&gt;
&lt;p&gt;Though, it does not work ideally. Well, screenshots of &lt;a href="https://selenide.org/images/2013/07/google-com-screenshot.png"&gt;google.com&lt;/a&gt;,
&lt;a href="https://selenide.org/images/2013/07/habrahabr-ru-screenshot.png"&gt;habrahabr.ru&lt;/a&gt; and
&lt;a href="https://selenide.org/images/2013/07/skype-com-screenshot.png"&gt;skype.com&lt;/a&gt; look good, but screenshot of
&lt;a href="https://selenide.org/images/2013/07/selenide-org-screenshot.png"&gt;selenide.org&lt;/a&gt; is quite strange.&lt;/p&gt;</description></item><item><title>Video: Selenide on SeleniumCamp 2013</title><link>https://selenide.org/2013/05/09/video-selenide-on-seleniumcamp/</link><pubDate>Thu, 09 May 2013 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2013/05/09/video-selenide-on-seleniumcamp/</guid><description>&lt;p&gt;This is our talk about Selenide on &lt;a href="http://seleniumcamp.com/materials/"&gt;SeleniumCamp 2013&lt;/a&gt; conference in Kiev.&lt;/p&gt;
&lt;p&gt;The talk is in Russian.&lt;/p&gt;
&lt;p&gt;First part - introduction to Selenide:&lt;/p&gt;
&lt;iframe src="//www.youtube.com/embed/4TegXkNWbqw" width="800" height="490" frameborder="0"&gt;&lt;/iframe&gt;
&lt;p&gt;Second part - live demonstration of Selenide:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pair programming&lt;/li&gt;
&lt;li&gt;ping-pong programming&lt;/li&gt;
&lt;li&gt;programming a real internet bank&lt;/li&gt;
&lt;/ul&gt;
&lt;iframe src="//www.youtube.com/embed/x3osTlsU82g" width="800" height="490" frameborder="0"&gt;&lt;/iframe&gt;</description></item><item><title>What is Selenide</title><link>https://selenide.org/2013/04/23/what-is-selenide/</link><pubDate>Tue, 23 Apr 2013 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/2013/04/23/what-is-selenide/</guid><description>&lt;p&gt;Many of you have tried &lt;a href="http://code.google.com/p/selenium/"&gt;Selenium WebDriver&lt;/a&gt; - one of the most popular tools for UI Testing.&lt;/p&gt;
&lt;p&gt;Writing UI Tests is not simple. There are a number of typical problems, including Ajax, dynamic pages and timeouts.
The goal of Selenide is to resolve these problems.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://selenide.org/images/selenide-logo-100x100.png" alt="right"&gt;&lt;/p&gt;
&lt;h3 id="what-is-selenide"&gt;What is Selenide&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://selenide.org"&gt;Selenide&lt;/a&gt; is a wrapper for Selenium WebDriver that allows you easier and faster writing of UI Tests.
With Selenide you can concentrate on business logic instead of solving all these endless browser/ajax/timeouts problems.&lt;/p&gt;</description></item><item><title/><link>https://selenide.org/documentation/clouds.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/documentation/clouds.html</guid><description>&lt;div class="left-menu-icon"&gt;
 &lt;img src="https://selenide.org/images/burger-menu-left.svg" width="32" alt="Menu"/&gt;
&lt;/div&gt;
&lt;div class="left-menu"&gt;
 &lt;div&gt;Docs&lt;/div&gt;
 &lt;div&gt;✓ &lt;a href="https://selenide.org/documentation.html"&gt;API&lt;/a&gt;&lt;/div&gt;
 &lt;div&gt;✓ &lt;a href="https://selenide.org/documentation/page-objects.html"&gt;Page Objects&lt;/a&gt;&lt;/div&gt;
 &lt;div&gt;✓ &lt;a href="https://selenide.org/documentation/screenshots.html"&gt;Screenshots&lt;/a&gt;&lt;/div&gt;
 &lt;div&gt;✓ &lt;a href="https://selenide.org/documentation/reports.html"&gt;Reports&lt;/a&gt;&lt;/div&gt;
 &lt;div&gt;✓ &lt;a href="https://selenide.org/documentation/clouds.html"&gt;Clouds&lt;/a&gt;&lt;/div&gt;
 &lt;div&gt;✓ &lt;a href="https://selenide.org/documentation/selenide-vs-selenium.html"&gt;Selenide vs Selenium&lt;/a&gt;&lt;/div&gt;

 &lt;br/&gt;
 &lt;div&gt;Resources&lt;/div&gt;
 &lt;div&gt;✓ &lt;a href="https://prezi.com/d18jggopjyaj/selenide-shorten-your-code/" target="_blank" class="external-link"&gt;Shorten your code!&lt;/a&gt;&lt;/div&gt;
 &lt;div&gt;✓ &lt;a href="https://www.methodsandtools.com/tools/selenide.php" target="_blank" class="external-link"&gt;Methods &amp; Tools&lt;/a&gt;&lt;/div&gt;
 

 &lt;br/&gt;
 &lt;div&gt;Video&lt;/div&gt;
 
 &lt;div&gt;✓ &lt;a class="video" href="https://vimeo.com/107647158"&gt;UI test in 10 minutes&lt;/a&gt;&lt;/div&gt;
 &lt;div&gt;✓ &lt;a class="video" href="https://www.youtube.com/watch?v=6LW4h5y6Iw4"&gt;Selenide by Glen Smith&lt;/a&gt;&lt;/div&gt;
 &lt;div&gt;✓ &lt;a class="video" href="https://www.youtube.com/watch?v=5qiuRoUcICs&amp;t=2882s&amp;ab_channel=trendigtechnologyservicesGmbH"&gt;Selenide UI tests in java&lt;/a&gt;&lt;/div&gt;
 &lt;div&gt;✓ &lt;a class="video" href="https://www.youtube.com/watch?v=18J2_4a4Cl4&amp;ab_channel=Jfokus"&gt;Flaky tests&lt;/a&gt;&lt;/div&gt;
 
&lt;/div&gt;

&lt;br&gt;
&lt;h4 id="-selenium-grid"&gt;&lt;a href="https://selenide.org/documentation/clouds.html#selenium-grid"&gt;&amp;gt; Selenium Grid&lt;/a&gt;&lt;/h4&gt;
&lt;h4 id="-testcontainers"&gt;&lt;a href="https://selenide.org/documentation/clouds.html#testcontainers"&gt;&amp;gt; TestContainers&lt;/a&gt;&lt;/h4&gt;
&lt;h4 id="-testmu-ai-ex-lambdatest"&gt;&lt;a href="https://selenide.org/documentation/clouds.html#testmu-ai"&gt;&amp;gt; TestMu AI (ex. LambdaTest)&lt;/a&gt;&lt;/h4&gt;
&lt;h4 id="-browserstack"&gt;&lt;a href="https://selenide.org/documentation/clouds.html#browserstack"&gt;&amp;gt; BrowserStack&lt;/a&gt;&lt;/h4&gt;
&lt;h4 id="-saucelabs"&gt;&lt;a href="https://selenide.org/documentation/clouds.html#saucelabs"&gt;&amp;gt; Saucelabs&lt;/a&gt;&lt;/h4&gt;
&lt;h4 id="-moon"&gt;&lt;a href="https://selenide.org/documentation/clouds.html#moon"&gt;&amp;gt; Moon&lt;/a&gt;&lt;/h4&gt;
&lt;h4 id="-selenoid"&gt;&lt;a href="https://selenide.org/documentation/clouds.html#selenoid"&gt;&amp;gt; Selenoid&lt;/a&gt;&lt;/h4&gt;
&lt;h4 id="-other-cloud-providers"&gt;&lt;a href="https://selenide.org/documentation/clouds.html#other"&gt;&amp;gt; Other cloud providers&lt;/a&gt;&lt;/h4&gt;
&lt;br&gt;
&lt;br&gt;
&lt;p&gt;The easiest, fastest and most reliable way is to launch a browser on the same machine with the test (the so-called “local” launch).
Or maybe in a Docker container on the same machine.&lt;/p&gt;</description></item><item><title/><link>https://selenide.org/documentation/page-objects.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/documentation/page-objects.html</guid><description>&lt;div class="left-menu-icon"&gt;
 &lt;img src="https://selenide.org/images/burger-menu-left.svg" width="32" alt="Menu"/&gt;
&lt;/div&gt;
&lt;div class="left-menu"&gt;
 &lt;div&gt;Docs&lt;/div&gt;
 &lt;div&gt;✓ &lt;a href="https://selenide.org/documentation.html"&gt;API&lt;/a&gt;&lt;/div&gt;
 &lt;div&gt;✓ &lt;a href="https://selenide.org/documentation/page-objects.html"&gt;Page Objects&lt;/a&gt;&lt;/div&gt;
 &lt;div&gt;✓ &lt;a href="https://selenide.org/documentation/screenshots.html"&gt;Screenshots&lt;/a&gt;&lt;/div&gt;
 &lt;div&gt;✓ &lt;a href="https://selenide.org/documentation/reports.html"&gt;Reports&lt;/a&gt;&lt;/div&gt;
 &lt;div&gt;✓ &lt;a href="https://selenide.org/documentation/clouds.html"&gt;Clouds&lt;/a&gt;&lt;/div&gt;
 &lt;div&gt;✓ &lt;a href="https://selenide.org/documentation/selenide-vs-selenium.html"&gt;Selenide vs Selenium&lt;/a&gt;&lt;/div&gt;

 &lt;br/&gt;
 &lt;div&gt;Resources&lt;/div&gt;
 &lt;div&gt;✓ &lt;a href="https://prezi.com/d18jggopjyaj/selenide-shorten-your-code/" target="_blank" class="external-link"&gt;Shorten your code!&lt;/a&gt;&lt;/div&gt;
 &lt;div&gt;✓ &lt;a href="https://www.methodsandtools.com/tools/selenide.php" target="_blank" class="external-link"&gt;Methods &amp; Tools&lt;/a&gt;&lt;/div&gt;
 

 &lt;br/&gt;
 &lt;div&gt;Video&lt;/div&gt;
 
 &lt;div&gt;✓ &lt;a class="video" href="https://vimeo.com/107647158"&gt;UI test in 10 minutes&lt;/a&gt;&lt;/div&gt;
 &lt;div&gt;✓ &lt;a class="video" href="https://www.youtube.com/watch?v=6LW4h5y6Iw4"&gt;Selenide by Glen Smith&lt;/a&gt;&lt;/div&gt;
 &lt;div&gt;✓ &lt;a class="video" href="https://www.youtube.com/watch?v=5qiuRoUcICs&amp;t=2882s&amp;ab_channel=trendigtechnologyservicesGmbH"&gt;Selenide UI tests in java&lt;/a&gt;&lt;/div&gt;
 &lt;div&gt;✓ &lt;a class="video" href="https://www.youtube.com/watch?v=18J2_4a4Cl4&amp;ab_channel=Jfokus"&gt;Flaky tests&lt;/a&gt;&lt;/div&gt;
 
&lt;/div&gt;

&lt;h2 id="page-objects---its-simple"&gt;Page Objects - it&amp;rsquo;s simple!&lt;/h2&gt;
&lt;p&gt;In the QA world, there is a very popular pattern &lt;a href="https://github.com/SeleniumHQ/selenium/wiki/PageFactory"&gt;Page Objects&lt;/a&gt;.
It means that for every page you create a separate class - &lt;em&gt;Page Object&lt;/em&gt;. This class should implement
logic of working with different page elements.
It&amp;rsquo;s thought that Page Object helps to avoid duplication of locators in tests.&lt;/p&gt;</description></item><item><title/><link>https://selenide.org/documentation/reports.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/documentation/reports.html</guid><description>&lt;div class="left-menu-icon"&gt;
 &lt;img src="https://selenide.org/images/burger-menu-left.svg" width="32" alt="Menu"/&gt;
&lt;/div&gt;
&lt;div class="left-menu"&gt;
 &lt;div&gt;Docs&lt;/div&gt;
 &lt;div&gt;✓ &lt;a href="https://selenide.org/documentation.html"&gt;API&lt;/a&gt;&lt;/div&gt;
 &lt;div&gt;✓ &lt;a href="https://selenide.org/documentation/page-objects.html"&gt;Page Objects&lt;/a&gt;&lt;/div&gt;
 &lt;div&gt;✓ &lt;a href="https://selenide.org/documentation/screenshots.html"&gt;Screenshots&lt;/a&gt;&lt;/div&gt;
 &lt;div&gt;✓ &lt;a href="https://selenide.org/documentation/reports.html"&gt;Reports&lt;/a&gt;&lt;/div&gt;
 &lt;div&gt;✓ &lt;a href="https://selenide.org/documentation/clouds.html"&gt;Clouds&lt;/a&gt;&lt;/div&gt;
 &lt;div&gt;✓ &lt;a href="https://selenide.org/documentation/selenide-vs-selenium.html"&gt;Selenide vs Selenium&lt;/a&gt;&lt;/div&gt;

 &lt;br/&gt;
 &lt;div&gt;Resources&lt;/div&gt;
 &lt;div&gt;✓ &lt;a href="https://prezi.com/d18jggopjyaj/selenide-shorten-your-code/" target="_blank" class="external-link"&gt;Shorten your code!&lt;/a&gt;&lt;/div&gt;
 &lt;div&gt;✓ &lt;a href="https://www.methodsandtools.com/tools/selenide.php" target="_blank" class="external-link"&gt;Methods &amp; Tools&lt;/a&gt;&lt;/div&gt;
 

 &lt;br/&gt;
 &lt;div&gt;Video&lt;/div&gt;
 
 &lt;div&gt;✓ &lt;a class="video" href="https://vimeo.com/107647158"&gt;UI test in 10 minutes&lt;/a&gt;&lt;/div&gt;
 &lt;div&gt;✓ &lt;a class="video" href="https://www.youtube.com/watch?v=6LW4h5y6Iw4"&gt;Selenide by Glen Smith&lt;/a&gt;&lt;/div&gt;
 &lt;div&gt;✓ &lt;a class="video" href="https://www.youtube.com/watch?v=5qiuRoUcICs&amp;t=2882s&amp;ab_channel=trendigtechnologyservicesGmbH"&gt;Selenide UI tests in java&lt;/a&gt;&lt;/div&gt;
 &lt;div&gt;✓ &lt;a class="video" href="https://www.youtube.com/watch?v=18J2_4a4Cl4&amp;ab_channel=Jfokus"&gt;Flaky tests&lt;/a&gt;&lt;/div&gt;
 
&lt;/div&gt;

&lt;br&gt;
&lt;h4 id="-yagni"&gt;&lt;a href="https://selenide.org/documentation/reports.html#yagni"&gt;&amp;gt; YAGNI&lt;/a&gt;&lt;/h4&gt;
&lt;h4 id="-text-report"&gt;&lt;a href="https://selenide.org/documentation/reports.html#text-report"&gt;&amp;gt; Text report&lt;/a&gt;&lt;/h4&gt;
&lt;h4 id="-allure-report"&gt;&lt;a href="https://selenide.org/documentation/reports.html#allure-report"&gt;&amp;gt; Allure report&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;&lt;a name="yagni"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="yagni"&gt;YAGNI&lt;/h2&gt;
&lt;p&gt;First of all, please think twice: probably you don&amp;rsquo;t need any specific reports.&lt;/p&gt;
&lt;p&gt;Both Gradle and Maven already generate good enough test report which includes all the errors.&lt;br&gt;
When a test fails, Selenide already generates a detailed error message
(including &lt;a href="https://selenide.org/documentation/screenshots.html"&gt;screenshot&lt;/a&gt; and html of a page).
Typically, it&amp;rsquo;s enough to understand why the test failed:&lt;/p&gt;</description></item><item><title/><link>https://selenide.org/documentation/screenshots.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/documentation/screenshots.html</guid><description>&lt;div class="left-menu-icon"&gt;
 &lt;img src="https://selenide.org/images/burger-menu-left.svg" width="32" alt="Menu"/&gt;
&lt;/div&gt;
&lt;div class="left-menu"&gt;
 &lt;div&gt;Docs&lt;/div&gt;
 &lt;div&gt;✓ &lt;a href="https://selenide.org/documentation.html"&gt;API&lt;/a&gt;&lt;/div&gt;
 &lt;div&gt;✓ &lt;a href="https://selenide.org/documentation/page-objects.html"&gt;Page Objects&lt;/a&gt;&lt;/div&gt;
 &lt;div&gt;✓ &lt;a href="https://selenide.org/documentation/screenshots.html"&gt;Screenshots&lt;/a&gt;&lt;/div&gt;
 &lt;div&gt;✓ &lt;a href="https://selenide.org/documentation/reports.html"&gt;Reports&lt;/a&gt;&lt;/div&gt;
 &lt;div&gt;✓ &lt;a href="https://selenide.org/documentation/clouds.html"&gt;Clouds&lt;/a&gt;&lt;/div&gt;
 &lt;div&gt;✓ &lt;a href="https://selenide.org/documentation/selenide-vs-selenium.html"&gt;Selenide vs Selenium&lt;/a&gt;&lt;/div&gt;

 &lt;br/&gt;
 &lt;div&gt;Resources&lt;/div&gt;
 &lt;div&gt;✓ &lt;a href="https://prezi.com/d18jggopjyaj/selenide-shorten-your-code/" target="_blank" class="external-link"&gt;Shorten your code!&lt;/a&gt;&lt;/div&gt;
 &lt;div&gt;✓ &lt;a href="https://www.methodsandtools.com/tools/selenide.php" target="_blank" class="external-link"&gt;Methods &amp; Tools&lt;/a&gt;&lt;/div&gt;
 

 &lt;br/&gt;
 &lt;div&gt;Video&lt;/div&gt;
 
 &lt;div&gt;✓ &lt;a class="video" href="https://vimeo.com/107647158"&gt;UI test in 10 minutes&lt;/a&gt;&lt;/div&gt;
 &lt;div&gt;✓ &lt;a class="video" href="https://www.youtube.com/watch?v=6LW4h5y6Iw4"&gt;Selenide by Glen Smith&lt;/a&gt;&lt;/div&gt;
 &lt;div&gt;✓ &lt;a class="video" href="https://www.youtube.com/watch?v=5qiuRoUcICs&amp;t=2882s&amp;ab_channel=trendigtechnologyservicesGmbH"&gt;Selenide UI tests in java&lt;/a&gt;&lt;/div&gt;
 &lt;div&gt;✓ &lt;a class="video" href="https://www.youtube.com/watch?v=18J2_4a4Cl4&amp;ab_channel=Jfokus"&gt;Flaky tests&lt;/a&gt;&lt;/div&gt;
 
&lt;/div&gt;

&lt;h2 id="can-selenide-take-screenshots"&gt;Can Selenide take screenshots?&lt;/h2&gt;
&lt;p&gt;Yes, Selenide takes screenshots &lt;strong&gt;automatically&lt;/strong&gt; on every test failure. This is very useful for error analysis.&lt;/p&gt;
&lt;p&gt;By default Selenide puts screenshots to folder &lt;code&gt;build/reports/tests&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="can-i-tell-selenide-to-put-screenshots-to-a-specific-folder"&gt;Can I tell Selenide to put screenshots to a specific folder?&lt;/h3&gt;
&lt;p&gt;Yes.
You can use property &lt;code&gt;-Dselenide.reportsFolder=test-result/reports&lt;/code&gt; to set any directory to store screenshots to.
For v4.x use &lt;code&gt;-Dselenide.reports=test-result/reports&lt;/code&gt;&lt;/p&gt;</description></item><item><title/><link>https://selenide.org/documentation/selenide-vs-selenium.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/documentation/selenide-vs-selenium.html</guid><description>&lt;div class="left-menu-icon"&gt;
 &lt;img src="https://selenide.org/images/burger-menu-left.svg" width="32" alt="Menu"/&gt;
&lt;/div&gt;
&lt;div class="left-menu"&gt;
 &lt;div&gt;Docs&lt;/div&gt;
 &lt;div&gt;✓ &lt;a href="https://selenide.org/documentation.html"&gt;API&lt;/a&gt;&lt;/div&gt;
 &lt;div&gt;✓ &lt;a href="https://selenide.org/documentation/page-objects.html"&gt;Page Objects&lt;/a&gt;&lt;/div&gt;
 &lt;div&gt;✓ &lt;a href="https://selenide.org/documentation/screenshots.html"&gt;Screenshots&lt;/a&gt;&lt;/div&gt;
 &lt;div&gt;✓ &lt;a href="https://selenide.org/documentation/reports.html"&gt;Reports&lt;/a&gt;&lt;/div&gt;
 &lt;div&gt;✓ &lt;a href="https://selenide.org/documentation/clouds.html"&gt;Clouds&lt;/a&gt;&lt;/div&gt;
 &lt;div&gt;✓ &lt;a href="https://selenide.org/documentation/selenide-vs-selenium.html"&gt;Selenide vs Selenium&lt;/a&gt;&lt;/div&gt;

 &lt;br/&gt;
 &lt;div&gt;Resources&lt;/div&gt;
 &lt;div&gt;✓ &lt;a href="https://prezi.com/d18jggopjyaj/selenide-shorten-your-code/" target="_blank" class="external-link"&gt;Shorten your code!&lt;/a&gt;&lt;/div&gt;
 &lt;div&gt;✓ &lt;a href="https://www.methodsandtools.com/tools/selenide.php" target="_blank" class="external-link"&gt;Methods &amp; Tools&lt;/a&gt;&lt;/div&gt;
 

 &lt;br/&gt;
 &lt;div&gt;Video&lt;/div&gt;
 
 &lt;div&gt;✓ &lt;a class="video" href="https://vimeo.com/107647158"&gt;UI test in 10 minutes&lt;/a&gt;&lt;/div&gt;
 &lt;div&gt;✓ &lt;a class="video" href="https://www.youtube.com/watch?v=6LW4h5y6Iw4"&gt;Selenide by Glen Smith&lt;/a&gt;&lt;/div&gt;
 &lt;div&gt;✓ &lt;a class="video" href="https://www.youtube.com/watch?v=5qiuRoUcICs&amp;t=2882s&amp;ab_channel=trendigtechnologyservicesGmbH"&gt;Selenide UI tests in java&lt;/a&gt;&lt;/div&gt;
 &lt;div&gt;✓ &lt;a class="video" href="https://www.youtube.com/watch?v=18J2_4a4Cl4&amp;ab_channel=Jfokus"&gt;Flaky tests&lt;/a&gt;&lt;/div&gt;
 
&lt;/div&gt;

&lt;h2 id="motivation"&gt;Motivation&lt;/h2&gt;
&lt;p&gt;Selenium WebDriver is a great tool, but it&amp;rsquo;s not a tool for testing. It&amp;rsquo;s a tool for browser manipulation.&lt;/p&gt;
&lt;p&gt;And Selenide is a tool for automated testing (build on top of Selenium WebDriver).&lt;/p&gt;</description></item><item><title>FAQ</title><link>https://selenide.org/faq.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/faq.html</guid><description>&lt;h2 id="motivation"&gt;Motivation&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Why Selenium webdriver is not enough?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Why yet another Selenium wrapper?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Briefly: shorter code, easier to read, no need to re-invent the wheels.&lt;/p&gt;
&lt;p&gt;And lots of features for testing.&lt;br&gt;
And automated screenshots and reports.&lt;br&gt;
And video recording.&lt;br&gt;
And tests for mobile apps.&lt;br&gt;
And much, much more&amp;hellip;&lt;/p&gt;
&lt;p&gt;Find more detailed answer &lt;a href="https://selenide.org/documentation/selenide-vs-selenium.html"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="page-objects"&gt;Page Objects&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Can I use Page Objects with Selenide?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Yes! You can use Page Objects with Selenide.&lt;/p&gt;
&lt;p&gt;Moreover, your page objects get &lt;strong&gt;concise and readable&lt;/strong&gt; with Selenide. See &lt;a href="https://selenide.org/documentation/page-objects.html"&gt;more details here&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Feedback</title><link>https://selenide.org/contacts.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/contacts.html</guid><description>&lt;script&gt;
 window.location = '/users.html#contact';
&lt;/script&gt;</description></item><item><title>javadoc</title><link>https://selenide.org/javadoc.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/javadoc.html</guid><description>&lt;iframe src="https://selenide.org/javadoc/current/" name="classFrame" style="width: 100%" height="600px" seamless="true"&gt;&lt;/iframe&gt;</description></item><item><title>Quick Start</title><link>https://selenide.org/quick-start.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/quick-start.html</guid><description>&lt;a class="video right" href="https://vimeo.com/107647158"&gt;
 How to write UI test in 10 minutes
&lt;/a&gt;
&lt;h3 id="for-maven-users"&gt;For Maven users:&lt;/h3&gt;
&lt;p&gt;Add these lines to file pom.xml:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.codeborne&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;selenide&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;7.16.0&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;scope&amp;gt;&lt;/span&gt;test&lt;span class="nt"&gt;&amp;lt;/scope&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="for-gradle-users"&gt;For Gradle users:&lt;/h3&gt;
&lt;p&gt;Add these lines to file build.gradle:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;dependencies&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;testImplementation&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;com.codeborne:selenide:7.16.0&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="start-writing-test"&gt;Start writing test&lt;/h2&gt;
&lt;p&gt;So easy! No more boring routines, we can start.&lt;/p&gt;
&lt;p&gt;Import required classes:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import static&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;com.codeborne.selenide.Selenide.*&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import static&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;com.codeborne.selenide.Condition.*&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;and write test:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Test&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;userCanLoginByUsername&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/login&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;$&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="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;user.name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="na"&gt;setValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;johny&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;#submit&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;click&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;.loading_progress&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;should&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disappear&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Waits until element disappears&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;#username&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;shouldHave&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Hello, Johny!&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Waits until element gets text&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ready!&lt;/p&gt;</description></item><item><title>Selenide blog</title><link>https://selenide.org/archive.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/archive.html</guid><description>&lt;script&gt;
 window.location = '/blog.html';
&lt;/script&gt;</description></item><item><title>Selenide users</title><link>https://selenide.org/users.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/users.html</guid><description/></item><item><title>We say THANKS to</title><link>https://selenide.org/thanks.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/thanks.html</guid><description>&lt;script&gt;
 window.location = '/users.html#thanks';
&lt;/script&gt;</description></item><item><title>What users say</title><link>https://selenide.org/quotes.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>andrei.solntsev@gmail.com (Andrei Solntsev)</author><guid>https://selenide.org/quotes.html</guid><description>&lt;br&gt;
&lt;blockquote&gt;
 &lt;p&gt;
 "I use Selenide for 4 years already and I can't stop praising it. It's much simpler and clearer, adds syntactic sugar, I don't need to reinvent the wheel and create custom methods. I'm very grateful to those who contribute to Selenide!"
 &lt;/p&gt;
 Lana Petrenko&lt;br/&gt;
 Senior Software Engineer In Test at Aledade, Inc. 
 &lt;br&gt;
 [&lt;a href="https://www.linkedin.com/feed/update/urn:li:ugcPost:6892107657344618497?commentUrn=urn%3Ali%3Acomment%3A%28ugcPost%3A6892107657344618497%2C6893925779655184384%29"&gt;source&lt;/a&gt;]
&lt;/blockquote&gt;
&lt;hr class="divider"/&gt;
&lt;blockquote&gt;
 &lt;p&gt;
 "Selenide is an open-source library that can make a huge impact on and accelerate software delivery by introducing a concise API, shorter expressions, and many other capabilities. It is a wrapper around Selenium WebDriver and is designed to solve problems that Selenium cannot address."
 &lt;/p&gt;</description></item></channel></rss>