OLD | NEW |
(Empty) | |
| 1 This file contains high-level info about how to use password manager tests and |
| 2 how to create new ones. |
| 3 |
| 4 The password manager tests purpose is to allow automatic password manager |
| 5 checking and avoiding to do so manually. |
| 6 The tests are written in python using selenium Webdriver library. |
| 7 |
| 8 |
| 9 =====Getting started===== |
| 10 |
| 11 Build ChromeDriver by building the 'chromedriver' target. This will |
| 12 create an executable binary in the build folder named 'chromedriver[.exe]'. |
| 13 |
| 14 Build chrome too by building the 'chrome' target. This will |
| 15 create an executable binary in the build folder named 'chrome[.exe]'. |
| 16 |
| 17 Install Selenium (the version tested was 2.41.0): |
| 18 pip install -U selenium |
| 19 |
| 20 |
| 21 For security reasons, we didn't publish the passwords and the usernames we |
| 22 used to test. So we put them to an xml file (websites.xml). The structure of |
| 23 the file is the following: |
| 24 <websites> |
| 25 <website name = "website name"> |
| 26 <username>username</username> |
| 27 <password>password</password> |
| 28 </website> |
| 29 <websites> |
| 30 You can ask someone to give you the websites.xml file and put it in the same |
| 31 folder as the tests. You can also create your own websites.xml with your |
| 32 personal accounts. |
| 33 WARNING: All the content of the PROFILEPATH is going to be deleted. |
| 34 Show the help: |
| 35 python tests.py --help |
| 36 Run all the working tests tests by executing: |
| 37 python tests.py --chrome-path CHROMEPATH --chromedriver-path CHROMEDRIVERPATH |
| 38 --profile-path PROFILEPATH [--passwords_path PASSWORDSPATH] |
| 39 |
| 40 Run all the tests by executing: |
| 41 python tests.py --all --chrome-path CHROMEPATH --chromedriver-path |
| 42 CHROMEDRIVERPATH --profile-path PROFILEPATH [--passwords_path PASSWORDSPATH] |
| 43 |
| 44 Run one or many tests by executing: |
| 45 python tests.py google --chrome-path CHROMEPATH --chromedriver-path |
| 46 CHROMEDRIVERPATH profile-path PROFILEPATH [--passwords_path PASSWORDSPATH] |
| 47 |
| 48 python tests.py google facebook --chrome-path CHROMEPATH --chromedriver-path |
| 49 CHROMEDRIVERPATH --profile-path PROFILEPATH [--passwords_path PASSWORDSPATH] |
| 50 |
| 51 python tests.py google facebook amazon --chrome-path CHROMEPATH |
| 52 --chromedriver-path CHROMEDRIVERPATH --profile-path PROFILEPATH |
| 53 [--passwords_path PASSWORDSPATH] |
| 54 |
| 55 To display the debugging messages on the screen, use: |
| 56 python tests.py --log DEBUG|INFO|WARNING|ERROR|CRITICAL --log-screen |
| 57 To save debugging messages into a file, use: |
| 58 python tests.py --log DEBUG|INFO|WARNING|ERROR|CRITICAL --log-file LOG_FILE |
| 59 |
| 60 |
| 61 =====Creating new test===== |
| 62 |
| 63 1) Open tests.py. |
| 64 |
| 65 2) Add tests like this: |
| 66 |
| 67 class NewWebsiteTest(WebsiteTest): |
| 68 |
| 69 def Login(self): |
| 70 # Add login steps for the website, for example: |
| 71 self.GoTo("http://url") |
| 72 self.FillUsernameInto("Username CSS selector") |
| 73 self.FillPasswordInto("Password CSS selector") |
| 74 self.Submit("Password CSS selector") |
| 75 |
| 76 def Logout(self): |
| 77 # Add logout steps for the website, for example: |
| 78 self.Click("Logout button CSS selector") |
| 79 |
| 80 Then, to create the new test, you need just to add: |
| 81 |
| 82 environment.AddWebsiteTest(NewWebsiteTest("website name")) |
| 83 |
| 84 * For security reasons, passwords and usernames need to be supplied in a |
| 85 separate XML file and never checked in to the repository. The XML file should |
| 86 contain data structured like this: |
| 87 |
| 88 <website name = "website name"> |
| 89 <username>username</username> |
| 90 <password>password</password> |
| 91 </website> |
| 92 |
| 93 The "website name" is only used to find the username and password in the xml |
| 94 file. |
| 95 |
| 96 |
| 97 Use the flowing methods to perform the login and logout: |
| 98 The methods that you can use are: |
| 99 |
| 100 * Click: find an element using CSS Selector and click on it. Throw an |
| 101 exception if the element is not visible. |
| 102 self.Click("css_selector") |
| 103 * ClickIfClickable: find an element using CSS Selector and click on it if it's |
| 104 possible to do that. |
| 105 self.ClickIfClickable("css_selector") |
| 106 * GoTo: navigate the main frame to a url. |
| 107 self.GoTo("url") |
| 108 * HoverOver: find an element using CSS Selector and hover over it. |
| 109 self.HoverOver("css_selector") |
| 110 * SendEnterTo: find an element using CSS Selector and send enter to it. |
| 111 self.SendEnterTo("css_selector") |
| 112 |
| 113 * IsDisplayed: check if an element is displayed. |
| 114 self.IsDisplayed("css_selector") |
| 115 * Wait: wait for some amount of time in seconds. |
| 116 self.Wait(10) |
| 117 * WaitUntilDisplayed: wait for an element defined using CSS Selector to be |
| 118 displayed. |
| 119 self.WaitUntilDisplayed("css_selector") |
| 120 |
| 121 * FillPasswordInto: find an input element using CSS Selector and fill it with |
| 122 the password. |
| 123 self.FillPasswordInto("css_selector") |
| 124 * FillUsernameInto: find an input element using CSS Selector and fill it with |
| 125 the username. |
| 126 self.FillUsernameInto("css_selector") |
| 127 * Submit: find an element using CSS Selector and call its submit() handler. |
| 128 self.Submit("css_selector") |
| 129 |
| 130 |
| 131 =====Files structure===== |
| 132 |
| 133 Classes: |
| 134 * environment.py: the definition the tests Environment. |
| 135 * websitetest.py: WebsiteTest is defined here. You need to create an instance |
| 136 of this class for each website you want to test. |
| 137 |
| 138 Tests: |
| 139 * tests.py: the tests setup and the configuration for each website happens |
| 140 here. This file contain 3 separate kinds of tests: |
| 141 |
| 142 1) working tests: tests that are supposed to work. If you have a problem with |
| 143 one of them, rerun it again. Or try using the Known Issues section to fix it. |
| 144 2) tests that can cause a crash (the cause of the crash is not related to the |
| 145 password manager): This means that this set is expected to become a working |
| 146 test or failing test when the issue that causes the crash now is solved. |
| 147 3) failing tests: tests that fail for known bug related to the password |
| 148 manager. When this bug is solved, all the tests that were failing because of |
| 149 it are going to be moved to working tests. |
| 150 |
| 151 Other files: |
| 152 * websites.xml : a private file where you can find all the passwords. You can |
| 153 ask someone to give it to you or just create your own with your personal |
| 154 accounts. |
| 155 <websites> |
| 156 <website name = "website name"> |
| 157 <username>username</username> |
| 158 <password>password</password> |
| 159 </website> |
| 160 </websites> |
| 161 |
| 162 |
| 163 =====Known Issues===== |
| 164 |
| 165 The tests are very fragile. Here are some suggestions for solving most of the |
| 166 problems: |
| 167 * Restart the tests. |
| 168 * Remove the profile if the tests fail at the beginning for unknown reason. |
| 169 * If tests fail, isolate the one that causes problem, read debugging messages |
| 170 and keep your eyes on the browser window to understand its causes: |
| 171 a) In the tests, we often need to wait for a menu to appear ... If the |
| 172 menu takes more time to appear than expected, the tests are going to fail. |
| 173 b) The websites change very often. And even if they are not changed, they some |
| 174 time show a popup that broke the tests. In the case you need to login manually |
| 175 to the website, close all popup and logout. |
| 176 * If you are logged in when the tests crashes, don't forget to log out before |
| 177 running the tests a second time. |
OLD | NEW |