Search code examples
unit-testingseleniumautomated-testsui-testing

Selenium Critique


I just wanted some opinions from people that have run Selenium (http://selenium.openqa.org) I have had a lot of experience with WaTiN and even wrote a recording suite for it. I had it producing some well-structured code but being only maintained by me it seems my company all but abandoned it.

If you have run selenium have you had a lot of success?

I will be using .NET 3.5, does Selenium work well with it?

Is the code produced clean or simply a list of all the interaction? (http://blogs.conchango.com/richardgriffin/archive/2006/11/14/Testing-Design-Pattern-for-using-WATiR_2F00_N.aspx)

How well does the distributed testing suite fair?

Any other gripes or compliments on the system would be greatly appreciated!


Solution

  • If you are using Selenium IDE to generate code, then you just get a list of every action that selenium will execute. To me, Selenium IDE is a good way to start or do a fast "try and see" test. But, when you think about maintainability and more readable code, you must write your own code.

    A good way to achieve good selenium code is to use the Page Object Pattern in a way that the code represents your navigation flow. Here is a good example that I see in Coding Dojo Floripa (from Brazil):

    public class GoogleTest {
    
        private Selenium selenium;
    
        @Before
        public void setUp() throws Exception {
                selenium = new DefaultSelenium("localhost", 4444, "*firefox",
                                "http://www.google.com/webhp?hl=en");
                selenium.start();
        }
    
        @Test
        public void codingDojoShouldBeInFirstPageOfResults() {
                GoogleHomePage home = new GoogleHomePage(selenium);
                GoogleSearchResults searchResults = home.searchFor("coding dojo");
                String firstEntry = searchResults.getResult(0);
                assertEquals("Coding Dojo Wiki: FrontPage", firstEntry);
        }
    
        @After
        public void tearDown() throws Exception {
                selenium.stop();
        }
    
    }
    
    
    public class GoogleHomePage {
    
        private final Selenium selenium;
    
        public GoogleHomePage(Selenium selenium) {
                this.selenium = selenium;
                this.selenium.open("http://www.google.com/webhp?hl=en");
                if (!"Google".equals(selenium.getTitle())) {
                        throw new IllegalStateException("Not the Google Home Page");
                }
        }
    
        public GoogleSearchResults searchFor(String string) {
                selenium.type("q", string);
                selenium.click("btnG");
                selenium.waitForPageToLoad("5000");
                return new GoogleSearchResults(string, selenium);
        }
    }
    
    public class GoogleSearchResults {
    
        private final Selenium selenium;
    
        public GoogleSearchResults(String string, Selenium selenium) {
                this.selenium = selenium;
                if (!(string + " - Google Search").equals(selenium.getTitle())) {
                        throw new IllegalStateException(
                                        "This is not the Google Results Page");
                }
        }
    
        public String getResult(int i) {
                String nameXPath = "xpath=id('res')/div[1]/div[" + (i + 1) + "]/h2/a";
                return selenium.getText(nameXPath);
        }
    }
    

    Hope that Helps