Fix selenuim-headless tests

This patch leave selenuim-headless non-voting since it was broken for a
while so we should be sure that it's stable enough.

Related blueprint: improve-horizon-testing
Change-Id: Ic2a877a4eefc2f10fb25e64c387b81fc18302a2a
This commit is contained in:
Ivan Kolodyazhny 2018-04-03 00:40:19 +03:00
parent 1f80d94459
commit ee95bf15d9
9 changed files with 49 additions and 18 deletions

View File

@ -26,6 +26,7 @@
- job: - job:
name: horizon-selenium-headless name: horizon-selenium-headless
parent: horizon-openstack-tox-base parent: horizon-openstack-tox-base
pre-run: playbooks/horizon-selenium-headless/pre.yaml
vars: vars:
tox_envlist: selenium-headless tox_envlist: selenium-headless

5
bindep.txt Normal file
View File

@ -0,0 +1,5 @@
# selenium tests
firefox [selenium]
xvfb [selenium platform:dpkg]
# already part of xorg-x11-server on openSUSE
xorg-x11-server-Xvfb [selenium platform:redhat]

View File

@ -1318,7 +1318,7 @@ class DetailProjectViewTests(test.BaseAdminViewTests):
@tag('selenium') @tag('selenium')
class SeleniumTests(test.SeleniumAdminTestCase): class SeleniumTests(test.SeleniumAdminTestCase, test.TestCase):
@test.create_mocks({api.keystone: ('get_default_domain', @test.create_mocks({api.keystone: ('get_default_domain',
'get_default_role', 'get_default_role',
'user_list', 'user_list',

View File

@ -993,11 +993,11 @@ class SeleniumTests(test.SeleniumAdminTestCase):
if api.keystone.VERSIONS.active >= 3: if api.keystone.VERSIONS.active >= 3:
api.keystone.tenant_list( api.keystone.tenant_list(
IgnoreArg(), domain=None).AndReturn( IgnoreArg(), False).AndReturn(
[self.tenants.list(), False]) [self.tenants.list(), False])
else: else:
api.keystone.tenant_list( api.keystone.tenant_list(
IgnoreArg(), user=None).AndReturn( IgnoreArg(), False).AndReturn(
[self.tenants.list(), False]) [self.tenants.list(), False])
api.keystone.role_list(IgnoreArg()).AndReturn(self.roles.list()) api.keystone.role_list(IgnoreArg()).AndReturn(self.roles.list())
@ -1011,8 +1011,7 @@ class SeleniumTests(test.SeleniumAdminTestCase):
self.selenium.get("%s%s" % (self.live_server_url, USERS_INDEX_URL)) self.selenium.get("%s%s" % (self.live_server_url, USERS_INDEX_URL))
# Open the modal menu # Open the modal menu
self.selenium.find_element_by_id("users__action_create") \ self.selenium.find_element_by_id("users__action_create").click()
.send_keys("\n")
wait = self.ui.WebDriverWait(self.selenium, 10, wait = self.ui.WebDriverWait(self.selenium, 10,
ignored_exceptions=[socket_timeout]) ignored_exceptions=[socket_timeout])
wait.until(lambda x: self.selenium.find_element_by_id("id_name")) wait.until(lambda x: self.selenium.find_element_by_id("id_name"))
@ -1033,7 +1032,7 @@ class SeleniumTests(test.SeleniumAdminTestCase):
@test.create_stubs({api.keystone: ('user_get',)}) @test.create_stubs({api.keystone: ('user_get',)})
def test_update_user_with_passwords_not_matching(self): def test_update_user_with_passwords_not_matching(self):
api.keystone.user_get(IsA(http.HttpRequest), '1', api.keystone.user_get(IsA(http.HttpRequest), '1',
admin=True).AndReturn(self.user) admin=False).AndReturn(self.user)
self.mox.ReplayAll() self.mox.ReplayAll()
self.selenium.get("%s%s" % (self.live_server_url, self.selenium.get("%s%s" % (self.live_server_url,

View File

@ -19,6 +19,7 @@
import os import os
from socket import timeout as socket_timeout from socket import timeout as socket_timeout
import tempfile
import unittest import unittest
from django import http from django import http
@ -376,13 +377,12 @@ class SeleniumTests(test.SeleniumTestCase):
driver.get("%s%s" % (self.live_server_url, INDEX_URL)) driver.get("%s%s" % (self.live_server_url, INDEX_URL))
# Open the modal menu # Open the modal menu
driver.find_element_by_id("images__action_create").send_keys("\n") driver.find_element_by_id("images__action_create").click()
wait = self.ui.WebDriverWait(self.selenium, 10, wait = self.ui.WebDriverWait(self.selenium, 10,
ignored_exceptions=[socket_timeout]) ignored_exceptions=[socket_timeout])
wait.until(lambda x: driver.find_element_by_id("id_disk_format")) wait.until(lambda x: driver.find_element_by_id("id_disk_format"))
srctypes = self.ui.Select(driver.find_element_by_id("id_source_type")) driver.find_element_by_xpath('//a[@data-select-value="url"]').click()
srctypes.select_by_value("url")
copyfrom = driver.find_element_by_id("id_image_url") copyfrom = driver.find_element_by_id("id_image_url")
copyfrom.send_keys("http://www.test.com/test.iso") copyfrom.send_keys("http://www.test.com/test.iso")
formats = self.ui.Select(driver.find_element_by_id("id_disk_format")) formats = self.ui.Select(driver.find_element_by_id("id_disk_format"))
@ -412,15 +412,16 @@ class SeleniumTests(test.SeleniumTestCase):
driver.get("%s%s" % (self.live_server_url, INDEX_URL)) driver.get("%s%s" % (self.live_server_url, INDEX_URL))
# Open the modal menu # Open the modal menu
driver.find_element_by_id("images__action_create").send_keys("\n") driver.find_element_by_id("images__action_create").click()
wait = self.ui.WebDriverWait(driver, 10, wait = self.ui.WebDriverWait(driver, 10,
ignored_exceptions=[socket_timeout]) ignored_exceptions=[socket_timeout])
wait.until(lambda x: driver.find_element_by_id("id_disk_format")) wait.until(lambda x: driver.find_element_by_id("id_disk_format"))
srctypes = self.ui.Select(driver.find_element_by_id("id_source_type")) driver.find_element_by_xpath('//a[@data-select-value="file"]').click()
srctypes.select_by_value("file") with tempfile.NamedTemporaryFile() as tmp:
driver.find_element_by_id("id_image_file").send_keys("/tmp/test.iso") driver.find_element_by_id("id_image_file").send_keys(tmp.name)
formats = self.ui.Select(driver.find_element_by_id("id_disk_format")) formats = self.ui.Select(driver.find_element_by_id("id_disk_format"))
formats.select_by_visible_text('ISO - Optical Disk Image')
body = formats.first_selected_option body = formats.first_selected_option
self.assertIn("ISO", body.text, self.assertIn("ISO", body.text,
"ISO should be selected when the extension is *.iso") "ISO should be selected when the extension is *.iso")
@ -443,11 +444,11 @@ class SeleniumTests(test.SeleniumTestCase):
ignored_exceptions=[socket_timeout]) ignored_exceptions=[socket_timeout])
wait.until(lambda x: driver.find_element_by_id("id_disk_format")) wait.until(lambda x: driver.find_element_by_id("id_disk_format"))
srctypes = self.ui.Select(driver.find_element_by_id("id_source_type")) driver.find_element_by_xpath('//a[@data-select-value="url"]').click()
srctypes.select_by_value("url")
copyfrom = driver.find_element_by_id("id_image_url") copyfrom = driver.find_element_by_id("id_image_url")
copyfrom.send_keys("http://www.test.com/test.iso") copyfrom.send_keys("http://www.test.com/test.iso")
formats = self.ui.Select(driver.find_element_by_id("id_disk_format")) formats = self.ui.Select(driver.find_element_by_id("id_disk_format"))
formats.select_by_visible_text('ISO - Optical Disk Image')
body = formats.first_selected_option body = formats.first_selected_option
self.assertIn("ISO", body.text, self.assertIn("ISO", body.text,
"ISO should be selected when the extension is *.iso") "ISO should be selected when the extension is *.iso")
@ -472,10 +473,12 @@ class SeleniumTests(test.SeleniumTestCase):
ignored_exceptions=[socket_timeout]) ignored_exceptions=[socket_timeout])
wait.until(lambda x: driver.find_element_by_id("id_disk_format")) wait.until(lambda x: driver.find_element_by_id("id_disk_format"))
srctypes = self.ui.Select(driver.find_element_by_id("id_source_type")) driver.find_element_by_xpath('//a[@data-select-value="file"]').click()
srctypes.select_by_value("file") with tempfile.NamedTemporaryFile() as tmp:
driver.find_element_by_id("id_image_file").send_keys("/tmp/test.iso") driver.find_element_by_id("id_image_file").send_keys(tmp.name)
formats = self.ui.Select(driver.find_element_by_id("id_disk_format")) formats = self.ui.Select(driver.find_element_by_id("id_disk_format"))
formats.select_by_visible_text('ISO - Optical Disk Image')
body = formats.first_selected_option body = formats.first_selected_option
self.assertIn("ISO", body.text, self.assertIn("ISO", body.text,
"ISO should be selected when the extension is *.iso") "ISO should be selected when the extension is *.iso")

View File

@ -134,6 +134,7 @@ settings_utils.find_static_files(HORIZON_CONFIG, AVAILABLE_THEMES,
# image form. If set to 'off', there will be no file form field on the create # image form. If set to 'off', there will be no file form field on the create
# image form. See documentation for deployment considerations. # image form. See documentation for deployment considerations.
HORIZON_IMAGES_UPLOAD_MODE = 'legacy' HORIZON_IMAGES_UPLOAD_MODE = 'legacy'
IMAGES_ALLOW_LOCATION = True
AVAILABLE_REGIONS = [ AVAILABLE_REGIONS = [
('http://localhost:5000/v3', 'local'), ('http://localhost:5000/v3', 'local'),

View File

@ -0,0 +1,7 @@
---
- hosts: all
roles:
- role: bindep
bindep_profile: selenium
become: true
- setup-selenium-tests

View File

@ -0,0 +1,2 @@
---
geckodriver_url: "https://github.com/mozilla/geckodriver/releases/download/v0.19.1/geckodriver-v0.19.1-linux64.tar.gz"

View File

@ -0,0 +1,13 @@
---
- name: download the Gecko WebDriver
get_url:
url: "{{ geckodriver_url }}"
dest: "/tmp/geckodriver.package"
- name: extract the Gecko WebDriver
become: true
unarchive:
src: "/tmp/geckodriver.package"
dest: "/usr/local/bin"
remote_src: yes