page_runner_unittest.py revision 90dce4d38c5ff5333bea97d859d4e484e27edf0c
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# found in the LICENSE file. 490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)import logging 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import os 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import tempfile 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import unittest 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.core import browser_finder 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.core import user_agent 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.page import page as page_module 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.page import page_set 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.page import page_test 1490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)from telemetry.page import page_test_results 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.page import page_runner 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.test import options_for_unittests 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SIMPLE_CREDENTIALS_STRING = """ 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "test": { 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "username": "example", 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "password": "asdf" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)""" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class StubCredentialsBackend(object): 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __init__(self, login_return_value): 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.did_get_login = False 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.did_get_login_no_longer_needed = False 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.login_return_value = login_return_value 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @property 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def credentials_type(self): # pylint: disable=R0201 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 'test' 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def LoginNeeded(self, tab, config): # pylint: disable=W0613 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.did_get_login = True 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return self.login_return_value 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def LoginNoLongerNeeded(self, tab): # pylint: disable=W0613 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.did_get_login_no_longer_needed = True 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PageRunnerTests(unittest.TestCase): 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # TODO(nduca): Move the basic "test failed, test succeeded" tests from 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) # page_measurement_unittest to here. 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def testHandlingOfCrashedTab(self): 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ps = page_set.PageSet() 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) page1 = page_module.Page('chrome://crash', ps) 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ps.pages.append(page1) 5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) results = page_test_results.PageTestResults() 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) class Test(page_test.PageTest): 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def RunTest(self, *args): 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pass 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) with page_runner.PageRunner(ps) as runner: 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) options = options_for_unittests.GetCopy() 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) possible_browser = browser_finder.FindBrowser(options) 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) runner.Run(options, possible_browser, Test('RunTest'), results) 6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) self.assertEquals(0, len(results.successes)) 6290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) self.assertEquals(1, len(results.errors)) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) def testDiscardFirstResult(self): 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ps = page_set.PageSet() 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) page = page_module.Page( 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 'file:///' + os.path.join('..', '..', 'unittest_data', 'blank.html'), 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ps, 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base_dir=os.path.dirname(__file__)) 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ps.pages.append(page) 7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) results = page_test_results.PageTestResults() 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) class Test(page_test.PageTest): 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) @property 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) def discard_first_result(self): 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return True 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) def RunTest(self, *args): 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) pass 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) with page_runner.PageRunner(ps) as runner: 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) options = options_for_unittests.GetCopy() 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) possible_browser = browser_finder.FindBrowser(options) 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) runner.Run(options, possible_browser, Test('RunTest'), results) 8490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) self.assertEquals(0, len(results.successes)) 8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) self.assertEquals(0, len(results.failures)) 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 8790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) def testCredentialsWhenLoginFails(self): 8890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) results = page_test_results.PageTestResults() 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) credentials_backend = StubCredentialsBackend(login_return_value=False) 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) did_run = self.runCredentialsTest(credentials_backend, results) 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert credentials_backend.did_get_login == True 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert credentials_backend.did_get_login_no_longer_needed == False 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert did_run == False 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) def testCredentialsWhenLoginSucceeds(self): 9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) results = page_test_results.PageTestResults() 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) credentials_backend = StubCredentialsBackend(login_return_value=True) 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) did_run = self.runCredentialsTest(credentials_backend, results) 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert credentials_backend.did_get_login == True 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert credentials_backend.did_get_login_no_longer_needed == True 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert did_run 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def runCredentialsTest(self, # pylint: disable=R0201 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) credentials_backend, 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) results): 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ps = page_set.PageSet() 10790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) page = page_module.Page( 10890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 'file:///' + os.path.join('..', '..', 'unittest_data', 'blank.html'), 10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ps, 11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base_dir=os.path.dirname(__file__)) 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) page.credentials = "test" 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ps.pages.append(page) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) did_run = [False] 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) try: 11790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) with tempfile.NamedTemporaryFile(delete=False) as f: 11890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) f.write(SIMPLE_CREDENTIALS_STRING) 11990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ps.credentials_path = f.name 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) class TestThatInstallsCredentialsBackend(page_test.PageTest): 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __init__(self, credentials_backend): 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) super(TestThatInstallsCredentialsBackend, self).__init__('RunTest') 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self._credentials_backend = credentials_backend 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def SetUpBrowser(self, browser): 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser.credentials.AddBackend(self._credentials_backend) 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def RunTest(self, page, tab, results): # pylint: disable=W0613,R0201 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) did_run[0] = True 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test = TestThatInstallsCredentialsBackend(credentials_backend) 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) with page_runner.PageRunner(ps) as runner: 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) options = options_for_unittests.GetCopy() 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) possible_browser = browser_finder.FindBrowser(options) 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) runner.Run(options, possible_browser, test, results) 13790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) finally: 13890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) os.remove(f.name) 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return did_run[0] 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def testUserAgent(self): 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ps = page_set.PageSet() 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) page = page_module.Page( 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 'file:///' + os.path.join('..', '..', 'unittest_data', 'blank.html'), 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ps, 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base_dir=os.path.dirname(__file__)) 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ps.pages.append(page) 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ps.user_agent_type = 'tablet' 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) class TestUserAgent(page_test.PageTest): 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def RunTest(self, page, tab, results): # pylint: disable=W0613,R0201 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) actual_user_agent = tab.EvaluateJavaScript('window.navigator.userAgent') 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_user_agent = user_agent.UA_TYPE_MAPPING['tablet'] 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert actual_user_agent.strip() == expected_user_agent 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # This is so we can check later that the test actually made it into this 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # function. Previously it was timing out before even getting here, which 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # should fail, but since it skipped all the asserts, it slipped by. 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.hasRun = True # pylint: disable=W0201 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test = TestUserAgent('RunTest') 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) with page_runner.PageRunner(ps) as runner: 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) options = options_for_unittests.GetCopy() 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) possible_browser = browser_finder.FindBrowser(options) 16690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) results = page_test_results.PageTestResults() 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) runner.Run(options, possible_browser, test, results) 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.assertTrue(hasattr(test, 'hasRun') and test.hasRun) 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # Ensure that page_runner forces exactly 1 tab before running a page. 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def testOneTab(self): 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ps = page_set.PageSet() 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) page = page_module.Page( 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 'file:///' + os.path.join('..', '..', 'unittest_data', 'blank.html'), 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ps, 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base_dir=os.path.dirname(__file__)) 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ps.pages.append(page) 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) class TestOneTab(page_test.PageTest): 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __init__(self, 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_method_name, 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) action_name_to_run='', 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) needs_browser_restart_after_each_run=False): 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) super(TestOneTab, self).__init__(test_method_name, action_name_to_run, 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) needs_browser_restart_after_each_run) 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self._browser = None 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def SetUpBrowser(self, browser): 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self._browser = browser 19190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if self._browser.supports_tab_control: 19290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) self._browser.tabs.New() 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def RunTest(self, page, tab, results): # pylint: disable=W0613,R0201 19590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if not self._browser.supports_tab_control: 19690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) logging.warning('Browser does not support tab control, skipping test') 19790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert len(self._browser.tabs) == 1 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test = TestOneTab('RunTest') 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) with page_runner.PageRunner(ps) as runner: 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) options = options_for_unittests.GetCopy() 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) possible_browser = browser_finder.FindBrowser(options) 20490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) results = page_test_results.PageTestResults() 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) runner.Run(options, possible_browser, test, results) 206