SlideShare a Scribd company logo
Lessons Learned:Migrating Tests To Selenium v2September 20, 2011Roger Hu (rhu@hearsaycorp.com)
Hearsay Social“If 2011 is the year of social media for business, Hearsay [Social] may have some say about it.”Enterprise leader in social media management for regulated B2C organizations
Enables reps to compliantly capitalize on LinkedIn, Twitter, and Facebook
Backed by Sequoia, NEA, Steve Chen, FB execs
Visionary founders and management team from GOOG, SFDC, MSFT, AMZNOverview of TalkReasons to SwitchOverview of Selenium v2Issues/Workarounds in Selenium v2 Q/A
Reasons to SwitchSelenium v2 more closely approximates the user experience.Internet Explorer (IE7/IE8) especially runs faster with Selenium v2 (> 20%?)Easier to write tests. WebDriver reflects how other JavaScript frameworks work.
Selenium v2 ApproachExample:driver = webdriver.Firefox()driver.find_element_by_xpath(“//a[text()=‘Create New Ad’”).click()driver.find_element_by_id(“ads_headline”).send_keys(“Selenium Testers Wanted”)Selenium server launches without needing proxy-based approach. Browser driver generates native keyboard/mouse clicks to more closely simulate user behavior.WebDriver API (REST-based) simpler.   Browser-specific driveri.e.: IEDriver.dll (IE), webdriver.xpi (Firefox)+WebDriver API
Complexities of Moving to Selenium v2Your tests have to be rewritten to leverage the WebDriver API. Record/playback less useful option? (Selenium IDE plug-in for Firefox)Synchronization issues: implement more implicit/explicit wait conditions (Selenium v2 sometimes acts like an impatient user) Hidden/non-visible elements can no longer be clicked.Specific WebDriverextension for each browser.Cross-browser issues with mouse click/keyboard events.CSS3 selectors now more dependent on the browser (unlike Selenium v1).Not all WebDriver extensions are fully baked (i.e. Chrome, Android, iPhone)Keeping up with the release cycles.Release Candidates: toggle()/select() removed from API.We do a lot of pip –U selenium.  Make sure you’re using the latest version of your preferred language binding!Documentation is sparse, and hard to debug without digging through Selenium source code (Java, C++, and JavaScript).
Visibility Mattersi.e. driver.find_element_by_id(“cms_toolbar_icon”).click()The X/Y coordinates of the element location are used to determine where to click.Hidden elements can no longer be acted upon until they are visible.The element gets focused and clicked.  Some quirky issues with elements at top or bottom of the screen exist.CSS z-index takes precedence now; the top-most element will be the one that receives the mouse event.   If you use any type of debug overlay tool (i.eDjango Debug Toolbar, Rails Footnotes, etc.) disable them before running your Selenium tests!
Using CookiesIn the Django Debug Toolbar case, we can set a cookie called ‘djdt’ to disable the overlay.You have to open a connection to the page before you can set the cookie.  Exceptions usually get thrown otherwise.
Contrary to the documentation, setting cookies actually requires passing in a dictionary of name, value, and secure parameters.driver.add_cookie({"name" : "djdt",                          "value" : "true",                          "path" : "/",                          "secure" : False})(name, value, secure parameters required)To set cookies in IE, Protected Mode must be disabled for all zones.  IE8 doesn’t appear to throw any exceptions if cookies can’t be set.Implicit vs. Explicit WaitsImplicit Waits vs. ExplicitImplicit waits just need to be set once during setup(server-side polling)Use implicit waits for most page loads, assuming you have a unique DOM element present.Implicit waits complete once element present in DOM (click and other mouse events require visible elements).Explicit WaitsRemember wait_for_page_load() and wait_for_condition() in Selenium v1?Use explicit waits for all other cases (i.e. popup dialogs that are already rendered in the DOM but aren’t shown, waiting for a DOM element to disappear, etc.):Use WebDriverWait’s anytime you need to avoid JS/database race conditions (client-side polling)Selenium v2.6.0+: ExpectedConditionsclass to handle often-used cases (clickable elements, text present, etc.)driver.implicitly_wait(30)   (sets timeout for finding elements)from selenium.webdriver.support.ui import WebDriverWaitWebDriverWait(driver, timeout=30).until(lambda driver: driver.find_element_by_css_selector("div.popup.contentul.tabs").is_displayed)) driver.find_element_by_id(“myelement”)driver.find_element_by_css_selector(“#myelement”)driver.find_element_by_xpath(“//div[@id=‘myelement’]”)WebDriverWait(driver, timeout=30).until(lambda x: driver.execute_script(“return jQuery.active === 0”)   (wait for Ajax calls to complete)
DemoSo how does this implicit/explicit wait stuff work?Let’s play Hearsay Social Says...http://hearsaysocialsays.appspot.com (Selenium v2 source code posted on the site)def play_level():driver.find_element_by_name("b").click()WebDriverWait(driver, timeout=10).until(lambda driver: driver.find_element_by_name("s").get_attribute("value") == "Player's  Turn")pcclicks = driver.execute_script("return pcclicks;")    for pcclick in pcclicks[1:]:ele = "pl%s" % pcclickdriver.find_element_by_name(ele).click()driver.find_element_by_name("b").click()    # Alert box shows up.  Let's dismiss it.driver.switch_to_alert()    Alert(driver).accept()for i in xrange(20):play_level()
Native vs. Synthetic EventsSelenium v1 relied entirely on generating events through JavaScript, while Selenium v2 tries to do it through the operating system.Selecting a dropdown:driver.find_element_by_xpath("//select[@id=‘myselect']/option[text()=‘Seattle']").select()  (deprecated)driver.find_elements_by_css_selector("#myselect option")[2].click()  # IE7/IE8 won’t click (JS issue)from selenium.webdriver.common.keys import Keysdriver.find_element_by_css_selector("#myselect").send_keys(Keys.DOWN) (IE7/IE8 have different behavior for disabled elements)One workaround:driver.execute_script(“$(‘#myselect option’][2].change()’);”)  (use jQuery to trigger select-box changes)You can always bypass some cross-browser issues related to native events by reverting to JavaScript-based events, though it’s not ideal.<select id=“myselect”>  <option value="1">Seattle</option>                                                                                                                                                                                      <option value="2“ disabled=disabled>Boston</option>                                                                                                                                                                                             <option value=”3”>San Francisco</option>  <option value=“4">Washington D.C.</option>                                                                                                                                                                                  </select>
Hover states, drag-and-drop, motion-based gestures, HTML5….Want more complex sequences of keyboard/mouse actions (i.e. right clicks, double clicks, drag/drop)?   Use the ActionChains class.Creating hover states: also done through ActionChains class. Remember, the elements still have to be visible for them to be chained!Many advanced user interactions still somewhat experimental, so expect issues.from selenium.webdriver import ActionChainsdriver.get(‘http://www.espn.com’)menu_mlb= driver.find_element_by_id("menu-mlb")chain = ActionChains(driver)chain.move_to_element(menu_mlb).perform()chain.move_to_element(menu_mlb).click(scores).perform() (scores is not visible until MLB is selected)scores = driver.find_elements_by_css_selector("#menu-mlb div.mod-content ul li")[1] scores.click()
Earlier blog postsabout Selenium encourage using CSS selectors instead of XPath:  div:contains(“Click here”)vs. //div[text()=“Click here”)Matching by inner text?  You still may need to use XPath.CSS selectors supported in Selenium v1 are not standard (i.e. contains())Selenium v2 relies on document.querySelector() for modern browsers (IE8+, Firefox 3.5+).  If document.querySelector() isn’t supported, the Sizzle CSS engine is used.Even if you’re using a CSS3 selector, check whether it’s supported in IE.driver.find_element_by_css_selector(“#ad-summary:last-child") (breaks in IE7)driver.find_element_by_css_selector(“#ad-summary.last") (workaround: explicitly define the last element when  rendering the HTML)CSS Selectors in Selenium v2
Other Tips & Tricks…Use Firebug with Selenium v2.Create a profile and installing the extension:firefox -ProfileManager --no-remote  (launch profile manager and install Firebug extension)Specify profile directory:	profile = FirefoxProfile(profile_directory=“/home/user/.mozilla/firefox/60f7of9x.selenium”)driver = webdriver.Firefox(firefox_profile=profile)Test on local browsers first, use SSH reverse tunneling when testing on remote devservers:Install Selenium server on host machine:java –jar selenium-server.jar (default port 4444)Create a SSH tunnel into remote machine: ssh-nNT -R 9999:<IP address of server>:4444 username@myhost.com(clients connect to port 9999)Login to remote machine and connect via webdriver.Remote()driver = webdriver.Remote(command_executor=http://localhost:9999/wd/hub)Using SauceLabs?  Make sure your max-duration: option is set if your test runs exceed 30 mins.   Can’t keep up with the Selenium v2 release cycles?  Fix your version with selenium-version: option.Use exit signals handlers to issue driver.quit() commands to see your test results sooner.
SummarySelenium v2 gets closer to simulating the user experience with an entirely new architecture (WebDriver API + browser plug-in/extension).Your tests may start failing on clicking on hidden/non-visible elements, so disable your debug overlays and be aware of CSS z-index issues.Bugs/issues with generating events still persist, and you may encounter many browser quirks (i.e. dropdown boxes).WebDriver may run faster, though you may need to add more synchronization checkpoints with implicit/explicit waits.When using CSS selectors, use the ones supported across all browsers (especially IE).

More Related Content

PPT
Don't Worry jQuery is very Easy:Learning Tips For jQuery
PPTX
Event In JavaScript
PDF
Jquery tutorial-beginners
PDF
Solr and symfony in Harmony with SolrJs
PPT
JavaScript Libraries
PDF
Dojo1.0_Tutorials
PPT
Js events
KEY
Inside jQuery (2011)
Don't Worry jQuery is very Easy:Learning Tips For jQuery
Event In JavaScript
Jquery tutorial-beginners
Solr and symfony in Harmony with SolrJs
JavaScript Libraries
Dojo1.0_Tutorials
Js events
Inside jQuery (2011)

What's hot (20)

PPTX
jQuery Presentasion
PPTX
Javascript event handler
PPTX
Intro to jQuery
PDF
jQuery for beginners
PDF
A comprehensive guide on developing responsive and common react filter component
DOCX
Error found
PPTX
Migration to jQuery 3.5.x
PPT
Android the Agile way
PDF
Dominando o Data Binding no Android
PDF
Business News, Personal Finance and Money News
PDF
Muster in Webcontrollern
PDF
What I’ve learned when developing BlockAlertViews
PDF
Introduction to jQuery
PPTX
Html events with javascript
PPT
Javascript dom event
PPTX
Web Development Introduction to jQuery
PPT
Jquery ui
PPT
Intro to jQuery
PDF
French kit2019
PPTX
SharePoint Cincy 2012 - jQuery essentials
jQuery Presentasion
Javascript event handler
Intro to jQuery
jQuery for beginners
A comprehensive guide on developing responsive and common react filter component
Error found
Migration to jQuery 3.5.x
Android the Agile way
Dominando o Data Binding no Android
Business News, Personal Finance and Money News
Muster in Webcontrollern
What I’ve learned when developing BlockAlertViews
Introduction to jQuery
Html events with javascript
Javascript dom event
Web Development Introduction to jQuery
Jquery ui
Intro to jQuery
French kit2019
SharePoint Cincy 2012 - jQuery essentials
Ad

Viewers also liked (20)

PDF
Bristol Cycle Festival
ODT
Activitats tema 1
PDF
Gay archipelago-bahasa-indonesia
PDF
North American BioFortean Review - Yuri Kuchinsky
PDF
36 quatro-níveis-de-avaliação-de-treinamento
PDF
Indian Horses Before Columbus Evidences in America
PPT
Personalized Learning at Your Fingertips: Building a PLN
PDF
Lorenc gordani winter outlook report 201415 and summer review 2014
PDF
Nb preparation pdf_c1slot
PDF
Thoughts On Patent Damages Landscape Post-Halo - Law360
PDF
Albanian Res by Dr Lorenc Gordani - Slides
PDF
Tablet School ImparaDigitale
PPTX
Photoshop
PDF
Sem 7 conteo de figuras
PPTX
Pro presentationass2
PDF
Интернет-агентство "видОК" - Seo-оптимизация для сайтов
PPTX
роль русского языка, литературы, истории и обществознания в современном обще...
PPTX
EMID Superintendents Report to School Board Working Session
PDF
CP_Pres_2.0_-_Generic
PPTX
Bristol Cycle Festival
Activitats tema 1
Gay archipelago-bahasa-indonesia
North American BioFortean Review - Yuri Kuchinsky
36 quatro-níveis-de-avaliação-de-treinamento
Indian Horses Before Columbus Evidences in America
Personalized Learning at Your Fingertips: Building a PLN
Lorenc gordani winter outlook report 201415 and summer review 2014
Nb preparation pdf_c1slot
Thoughts On Patent Damages Landscape Post-Halo - Law360
Albanian Res by Dr Lorenc Gordani - Slides
Tablet School ImparaDigitale
Photoshop
Sem 7 conteo de figuras
Pro presentationass2
Интернет-агентство "видОК" - Seo-оптимизация для сайтов
роль русского языка, литературы, истории и обществознания в современном обще...
EMID Superintendents Report to School Board Working Session
CP_Pres_2.0_-_Generic
Ad

Similar to Lessons Learned: Migrating Tests to Selenium v2 (20)

PDF
Real World Selenium
PPT
Flyweight jquery select_presentation
PDF
Selenium documentation 1.0
PDF
Migration strategies 4
PDF
Efficient Rails Test-Driven Development - Week 6
PDF
2010 07-18.wa.rails tdd-6
PPTX
2016 09-09 - Selenium Webdriver - Fundamentals + Hands-on!
PPTX
Automated_Testing_Selenium
PDF
Gilt Groupe's Selenium 2 Conversion Challenges
KEY
The HTML select tag styling challenge
PDF
Real Browser Check Scripting Guide - Rigor Monitoring
PPT
PDF
Rf meetup 16.3.2017 tampere share
PDF
Real World Selenium Testing
PPT
Selenium
PDF
Selenium Introduction by Sandeep Sharda
PPTX
Automation Testing by Selenium Web Driver
PDF
Selenium python
PDF
Testing Smalltalk AJAX/SJAX Web Applications with Selenium 4
PPT
selenium.ppt
Real World Selenium
Flyweight jquery select_presentation
Selenium documentation 1.0
Migration strategies 4
Efficient Rails Test-Driven Development - Week 6
2010 07-18.wa.rails tdd-6
2016 09-09 - Selenium Webdriver - Fundamentals + Hands-on!
Automated_Testing_Selenium
Gilt Groupe's Selenium 2 Conversion Challenges
The HTML select tag styling challenge
Real Browser Check Scripting Guide - Rigor Monitoring
Rf meetup 16.3.2017 tampere share
Real World Selenium Testing
Selenium
Selenium Introduction by Sandeep Sharda
Automation Testing by Selenium Web Driver
Selenium python
Testing Smalltalk AJAX/SJAX Web Applications with Selenium 4
selenium.ppt

Recently uploaded (20)

PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PDF
NewMind AI Weekly Chronicles - August'25-Week II
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PPTX
Machine Learning_overview_presentation.pptx
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PDF
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
PDF
Empathic Computing: Creating Shared Understanding
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
DOCX
The AUB Centre for AI in Media Proposal.docx
PDF
gpt5_lecture_notes_comprehensive_20250812015547.pdf
PDF
Assigned Numbers - 2025 - Bluetooth® Document
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PDF
Electronic commerce courselecture one. Pdf
PDF
Spectral efficient network and resource selection model in 5G networks
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Digital-Transformation-Roadmap-for-Companies.pptx
NewMind AI Weekly Chronicles - August'25-Week II
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
The Rise and Fall of 3GPP – Time for a Sabbatical?
Machine Learning_overview_presentation.pptx
Agricultural_Statistics_at_a_Glance_2022_0.pdf
Dropbox Q2 2025 Financial Results & Investor Presentation
Advanced methodologies resolving dimensionality complications for autism neur...
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
Empathic Computing: Creating Shared Understanding
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
The AUB Centre for AI in Media Proposal.docx
gpt5_lecture_notes_comprehensive_20250812015547.pdf
Assigned Numbers - 2025 - Bluetooth® Document
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
“AI and Expert System Decision Support & Business Intelligence Systems”
Electronic commerce courselecture one. Pdf
Spectral efficient network and resource selection model in 5G networks

Lessons Learned: Migrating Tests to Selenium v2

  • 1. Lessons Learned:Migrating Tests To Selenium v2September 20, 2011Roger Hu (rhu@hearsaycorp.com)
  • 2. Hearsay Social“If 2011 is the year of social media for business, Hearsay [Social] may have some say about it.”Enterprise leader in social media management for regulated B2C organizations
  • 3. Enables reps to compliantly capitalize on LinkedIn, Twitter, and Facebook
  • 4. Backed by Sequoia, NEA, Steve Chen, FB execs
  • 5. Visionary founders and management team from GOOG, SFDC, MSFT, AMZNOverview of TalkReasons to SwitchOverview of Selenium v2Issues/Workarounds in Selenium v2 Q/A
  • 6. Reasons to SwitchSelenium v2 more closely approximates the user experience.Internet Explorer (IE7/IE8) especially runs faster with Selenium v2 (> 20%?)Easier to write tests. WebDriver reflects how other JavaScript frameworks work.
  • 7. Selenium v2 ApproachExample:driver = webdriver.Firefox()driver.find_element_by_xpath(“//a[text()=‘Create New Ad’”).click()driver.find_element_by_id(“ads_headline”).send_keys(“Selenium Testers Wanted”)Selenium server launches without needing proxy-based approach. Browser driver generates native keyboard/mouse clicks to more closely simulate user behavior.WebDriver API (REST-based) simpler. Browser-specific driveri.e.: IEDriver.dll (IE), webdriver.xpi (Firefox)+WebDriver API
  • 8. Complexities of Moving to Selenium v2Your tests have to be rewritten to leverage the WebDriver API. Record/playback less useful option? (Selenium IDE plug-in for Firefox)Synchronization issues: implement more implicit/explicit wait conditions (Selenium v2 sometimes acts like an impatient user) Hidden/non-visible elements can no longer be clicked.Specific WebDriverextension for each browser.Cross-browser issues with mouse click/keyboard events.CSS3 selectors now more dependent on the browser (unlike Selenium v1).Not all WebDriver extensions are fully baked (i.e. Chrome, Android, iPhone)Keeping up with the release cycles.Release Candidates: toggle()/select() removed from API.We do a lot of pip –U selenium. Make sure you’re using the latest version of your preferred language binding!Documentation is sparse, and hard to debug without digging through Selenium source code (Java, C++, and JavaScript).
  • 9. Visibility Mattersi.e. driver.find_element_by_id(“cms_toolbar_icon”).click()The X/Y coordinates of the element location are used to determine where to click.Hidden elements can no longer be acted upon until they are visible.The element gets focused and clicked. Some quirky issues with elements at top or bottom of the screen exist.CSS z-index takes precedence now; the top-most element will be the one that receives the mouse event. If you use any type of debug overlay tool (i.eDjango Debug Toolbar, Rails Footnotes, etc.) disable them before running your Selenium tests!
  • 10. Using CookiesIn the Django Debug Toolbar case, we can set a cookie called ‘djdt’ to disable the overlay.You have to open a connection to the page before you can set the cookie. Exceptions usually get thrown otherwise.
  • 11. Contrary to the documentation, setting cookies actually requires passing in a dictionary of name, value, and secure parameters.driver.add_cookie({"name" : "djdt", "value" : "true", "path" : "/", "secure" : False})(name, value, secure parameters required)To set cookies in IE, Protected Mode must be disabled for all zones. IE8 doesn’t appear to throw any exceptions if cookies can’t be set.Implicit vs. Explicit WaitsImplicit Waits vs. ExplicitImplicit waits just need to be set once during setup(server-side polling)Use implicit waits for most page loads, assuming you have a unique DOM element present.Implicit waits complete once element present in DOM (click and other mouse events require visible elements).Explicit WaitsRemember wait_for_page_load() and wait_for_condition() in Selenium v1?Use explicit waits for all other cases (i.e. popup dialogs that are already rendered in the DOM but aren’t shown, waiting for a DOM element to disappear, etc.):Use WebDriverWait’s anytime you need to avoid JS/database race conditions (client-side polling)Selenium v2.6.0+: ExpectedConditionsclass to handle often-used cases (clickable elements, text present, etc.)driver.implicitly_wait(30) (sets timeout for finding elements)from selenium.webdriver.support.ui import WebDriverWaitWebDriverWait(driver, timeout=30).until(lambda driver: driver.find_element_by_css_selector("div.popup.contentul.tabs").is_displayed)) driver.find_element_by_id(“myelement”)driver.find_element_by_css_selector(“#myelement”)driver.find_element_by_xpath(“//div[@id=‘myelement’]”)WebDriverWait(driver, timeout=30).until(lambda x: driver.execute_script(“return jQuery.active === 0”) (wait for Ajax calls to complete)
  • 12. DemoSo how does this implicit/explicit wait stuff work?Let’s play Hearsay Social Says...http://hearsaysocialsays.appspot.com (Selenium v2 source code posted on the site)def play_level():driver.find_element_by_name("b").click()WebDriverWait(driver, timeout=10).until(lambda driver: driver.find_element_by_name("s").get_attribute("value") == "Player's Turn")pcclicks = driver.execute_script("return pcclicks;") for pcclick in pcclicks[1:]:ele = "pl%s" % pcclickdriver.find_element_by_name(ele).click()driver.find_element_by_name("b").click() # Alert box shows up. Let's dismiss it.driver.switch_to_alert() Alert(driver).accept()for i in xrange(20):play_level()
  • 13. Native vs. Synthetic EventsSelenium v1 relied entirely on generating events through JavaScript, while Selenium v2 tries to do it through the operating system.Selecting a dropdown:driver.find_element_by_xpath("//select[@id=‘myselect']/option[text()=‘Seattle']").select() (deprecated)driver.find_elements_by_css_selector("#myselect option")[2].click() # IE7/IE8 won’t click (JS issue)from selenium.webdriver.common.keys import Keysdriver.find_element_by_css_selector("#myselect").send_keys(Keys.DOWN) (IE7/IE8 have different behavior for disabled elements)One workaround:driver.execute_script(“$(‘#myselect option’][2].change()’);”) (use jQuery to trigger select-box changes)You can always bypass some cross-browser issues related to native events by reverting to JavaScript-based events, though it’s not ideal.<select id=“myselect”> <option value="1">Seattle</option> <option value="2“ disabled=disabled>Boston</option> <option value=”3”>San Francisco</option> <option value=“4">Washington D.C.</option> </select>
  • 14. Hover states, drag-and-drop, motion-based gestures, HTML5….Want more complex sequences of keyboard/mouse actions (i.e. right clicks, double clicks, drag/drop)? Use the ActionChains class.Creating hover states: also done through ActionChains class. Remember, the elements still have to be visible for them to be chained!Many advanced user interactions still somewhat experimental, so expect issues.from selenium.webdriver import ActionChainsdriver.get(‘http://www.espn.com’)menu_mlb= driver.find_element_by_id("menu-mlb")chain = ActionChains(driver)chain.move_to_element(menu_mlb).perform()chain.move_to_element(menu_mlb).click(scores).perform() (scores is not visible until MLB is selected)scores = driver.find_elements_by_css_selector("#menu-mlb div.mod-content ul li")[1] scores.click()
  • 15. Earlier blog postsabout Selenium encourage using CSS selectors instead of XPath: div:contains(“Click here”)vs. //div[text()=“Click here”)Matching by inner text? You still may need to use XPath.CSS selectors supported in Selenium v1 are not standard (i.e. contains())Selenium v2 relies on document.querySelector() for modern browsers (IE8+, Firefox 3.5+). If document.querySelector() isn’t supported, the Sizzle CSS engine is used.Even if you’re using a CSS3 selector, check whether it’s supported in IE.driver.find_element_by_css_selector(“#ad-summary:last-child") (breaks in IE7)driver.find_element_by_css_selector(“#ad-summary.last") (workaround: explicitly define the last element when rendering the HTML)CSS Selectors in Selenium v2
  • 16. Other Tips & Tricks…Use Firebug with Selenium v2.Create a profile and installing the extension:firefox -ProfileManager --no-remote (launch profile manager and install Firebug extension)Specify profile directory: profile = FirefoxProfile(profile_directory=“/home/user/.mozilla/firefox/60f7of9x.selenium”)driver = webdriver.Firefox(firefox_profile=profile)Test on local browsers first, use SSH reverse tunneling when testing on remote devservers:Install Selenium server on host machine:java –jar selenium-server.jar (default port 4444)Create a SSH tunnel into remote machine: ssh-nNT -R 9999:<IP address of server>:4444 username@myhost.com(clients connect to port 9999)Login to remote machine and connect via webdriver.Remote()driver = webdriver.Remote(command_executor=http://localhost:9999/wd/hub)Using SauceLabs? Make sure your max-duration: option is set if your test runs exceed 30 mins. Can’t keep up with the Selenium v2 release cycles? Fix your version with selenium-version: option.Use exit signals handlers to issue driver.quit() commands to see your test results sooner.
  • 17. SummarySelenium v2 gets closer to simulating the user experience with an entirely new architecture (WebDriver API + browser plug-in/extension).Your tests may start failing on clicking on hidden/non-visible elements, so disable your debug overlays and be aware of CSS z-index issues.Bugs/issues with generating events still persist, and you may encounter many browser quirks (i.e. dropdown boxes).WebDriver may run faster, though you may need to add more synchronization checkpoints with implicit/explicit waits.When using CSS selectors, use the ones supported across all browsers (especially IE).
  • 18. Q/A