ozone: evdev: Sync caps lock LED state to evdev
[chromium-blink-merge.git] / tools / perf / page_sets / key_silk_cases.py
blob25ceb21a4bb73f5ad360625d9aa55c73c023c69b
1 # Copyright 2014 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
4 from telemetry.page import page as page_module
5 from telemetry.page import page_set as page_set_module
8 class KeySilkCasesPage(page_module.Page):
10 def __init__(self, url, page_set, run_no_page_interactions):
11 """ Base class for all key silk cases pages.
13 Args:
14 run_no_page_interactions: whether the page will run any interactions after
15 navigate steps.
16 """
17 super(KeySilkCasesPage, self).__init__(
18 url=url, page_set=page_set, credentials_path = 'data/credentials.json')
19 self.user_agent_type = 'mobile'
20 self.archive_data_file = 'data/key_silk_cases.json'
21 self._run_no_page_interactions = run_no_page_interactions
23 def RunNavigateSteps(self, action_runner):
24 super(KeySilkCasesPage, self).RunNavigateSteps(action_runner)
25 action_runner.Wait(2)
27 def RunPageInteractions(self, action_runner):
28 # If a key silk case page wants to customize it actions, it should
29 # overrides the PerformPageInteractions method instead of this method.
30 if self._run_no_page_interactions:
31 return
32 self.PerformPageInteractions(action_runner)
34 def PerformPageInteractions(self, action_runner):
35 """ Perform interactions on page after navigate steps.
36 Override this to define custom actions to be run after navigate steps.
37 """
38 interaction = action_runner.BeginGestureInteraction(
39 'ScrollAction', is_smooth=True)
40 action_runner.ScrollPage()
41 interaction.End()
44 class Page1(KeySilkCasesPage):
46 """ Why: Infinite scroll. Brings out all of our perf issues. """
48 def __init__(self, page_set, run_no_page_interactions):
49 super(Page1, self).__init__(
50 url='http://groupcloned.com/test/plain/list-recycle-transform.html',
51 page_set=page_set, run_no_page_interactions=run_no_page_interactions)
53 def PerformPageInteractions(self, action_runner):
54 interaction = action_runner.BeginGestureInteraction(
55 'ScrollAction', is_smooth=True)
56 action_runner.ScrollElement(selector='#scrollable')
57 interaction.End()
60 class Page2(KeySilkCasesPage):
62 """ Why: Brings out layer management bottlenecks. """
64 def __init__(self, page_set, run_no_page_interactions):
65 super(Page2, self).__init__(
66 url='file://key_silk_cases/list_animation_simple.html',
67 page_set=page_set, run_no_page_interactions=run_no_page_interactions)
69 def PerformPageInteractions(self, action_runner):
70 action_runner.Wait(2)
73 class Page3(KeySilkCasesPage):
75 """
76 Why: Best-known method for fake sticky. Janks sometimes. Interacts badly with
77 compositor scrolls.
78 """
80 def __init__(self, page_set, run_no_page_interactions):
81 super(Page3, self).__init__(
82 # pylint: disable=C0301
83 url='http://groupcloned.com/test/plain/sticky-using-webkit-backface-visibility.html',
84 page_set=page_set, run_no_page_interactions=run_no_page_interactions)
86 def PerformPageInteractions(self, action_runner):
87 interaction = action_runner.BeginGestureInteraction(
88 'ScrollAction', is_smooth=True)
89 action_runner.ScrollElement(selector='#container')
90 interaction.End()
93 class Page4(KeySilkCasesPage):
95 """
96 Why: Card expansion: only the card should repaint, but in reality lots of
97 storms happen.
98 """
100 def __init__(self, page_set, run_no_page_interactions):
101 super(Page4, self).__init__(
102 url='http://jsfiddle.net/3yDKh/15/show/',
103 page_set=page_set, run_no_page_interactions=run_no_page_interactions)
105 def PerformPageInteractions(self, action_runner):
106 action_runner.Wait(3)
109 class Page5(KeySilkCasesPage):
112 Why: Card expansion with animated contents, using will-change on the card
115 def __init__(self, page_set, run_no_page_interactions):
116 super(Page5, self).__init__(
117 url='http://jsfiddle.net/jx5De/14/show/',
118 page_set=page_set, run_no_page_interactions=run_no_page_interactions)
120 self.gpu_raster = True
122 def PerformPageInteractions(self, action_runner):
123 action_runner.Wait(4)
126 class Page6(KeySilkCasesPage):
129 Why: Card fly-in: It should be fast to animate in a bunch of cards using
130 margin-top and letting layout do the rest.
133 def __init__(self, page_set, run_no_page_interactions):
134 super(Page6, self).__init__(
135 url='http://jsfiddle.net/3yDKh/16/show/',
136 page_set=page_set, run_no_page_interactions=run_no_page_interactions)
138 def PerformPageInteractions(self, action_runner):
139 action_runner.Wait(3)
142 class Page7(KeySilkCasesPage):
145 Why: Image search expands a spacer div when you click an image to accomplish
146 a zoomin effect. Each image has a layer. Even so, this triggers a lot of
147 unnecessary repainting.
150 def __init__(self, page_set, run_no_page_interactions):
151 super(Page7, self).__init__(
152 url='http://jsfiddle.net/R8DX9/4/show/',
153 page_set=page_set, run_no_page_interactions=run_no_page_interactions)
155 def PerformPageInteractions(self, action_runner):
156 action_runner.Wait(3)
159 class Page8(KeySilkCasesPage):
162 Why: Swipe to dismiss of an element that has a fixed-position child that is
163 its pseudo-sticky header. Brings out issues with layer creation and
164 repainting.
167 def __init__(self, page_set, run_no_page_interactions):
168 super(Page8, self).__init__(
169 url='http://jsfiddle.net/rF9Gh/7/show/',
170 page_set=page_set, run_no_page_interactions=run_no_page_interactions)
172 def PerformPageInteractions(self, action_runner):
173 action_runner.Wait(3)
176 class Page9(KeySilkCasesPage):
179 Why: Horizontal and vertical expansion of a card that is cheap to layout but
180 costly to rasterize.
183 def __init__(self, page_set, run_no_page_interactions):
184 super(Page9, self).__init__(
185 url='http://jsfiddle.net/TLXLu/3/show/',
186 page_set=page_set, run_no_page_interactions=run_no_page_interactions)
188 self.gpu_raster = True
190 def PerformPageInteractions(self, action_runner):
191 action_runner.Wait(4)
194 class Page10(KeySilkCasesPage):
197 Why: Vertical Expansion of a card that is cheap to layout but costly to
198 rasterize.
201 def __init__(self, page_set, run_no_page_interactions):
202 super(Page10, self).__init__(
203 url='http://jsfiddle.net/cKB9D/7/show/',
204 page_set=page_set, run_no_page_interactions=run_no_page_interactions)
206 self.gpu_raster = True
208 def PerformPageInteractions(self, action_runner):
209 action_runner.Wait(4)
212 class Page11(KeySilkCasesPage):
215 Why: Parallax effect is common on photo-viewer-like applications, overloading
216 software rasterization
219 def __init__(self, page_set, run_no_page_interactions):
220 super(Page11, self).__init__(
221 url='http://jsfiddle.net/vBQHH/11/show/',
222 page_set=page_set, run_no_page_interactions=run_no_page_interactions)
224 self.gpu_raster = True
226 def PerformPageInteractions(self, action_runner):
227 action_runner.Wait(4)
230 class Page12(KeySilkCasesPage):
232 """ Why: Addressing paint storms during coordinated animations. """
234 def __init__(self, page_set, run_no_page_interactions):
235 super(Page12, self).__init__(
236 url='http://jsfiddle.net/ugkd4/10/show/',
237 page_set=page_set, run_no_page_interactions=run_no_page_interactions)
239 def PerformPageInteractions(self, action_runner):
240 action_runner.Wait(5)
243 class Page13(KeySilkCasesPage):
245 """ Why: Mask transitions are common mobile use cases. """
247 def __init__(self, page_set, run_no_page_interactions):
248 super(Page13, self).__init__(
249 url='http://jsfiddle.net/xLuvC/1/show/',
250 page_set=page_set, run_no_page_interactions=run_no_page_interactions)
252 self.gpu_raster = True
254 def PerformPageInteractions(self, action_runner):
255 action_runner.Wait(4)
258 class Page14(KeySilkCasesPage):
260 """ Why: Card expansions with images and text are pretty and common. """
262 def __init__(self, page_set, run_no_page_interactions):
263 super(Page14, self).__init__(
264 url='http://jsfiddle.net/bNp2h/3/show/',
265 page_set=page_set, run_no_page_interactions=run_no_page_interactions)
267 self.gpu_raster = True
269 def PerformPageInteractions(self, action_runner):
270 action_runner.Wait(4)
273 class Page15(KeySilkCasesPage):
275 """ Why: Coordinated animations for expanding elements. """
277 def __init__(self, page_set, run_no_page_interactions):
278 super(Page15, self).__init__(
279 url='file://key_silk_cases/font_wipe.html',
280 page_set=page_set, run_no_page_interactions=run_no_page_interactions)
282 def PerformPageInteractions(self, action_runner):
283 action_runner.Wait(5)
286 class Page16(KeySilkCasesPage):
288 def __init__(self, page_set, run_no_page_interactions):
289 super(Page16, self).__init__(
290 url='file://key_silk_cases/inbox_app.html?swipe_to_dismiss',
291 page_set=page_set, run_no_page_interactions=run_no_page_interactions)
293 def SwipeToDismiss(self, action_runner):
294 interaction = action_runner.BeginGestureInteraction(
295 'SwipeAction', is_smooth=True)
296 action_runner.SwipeElement(
297 left_start_ratio=0.8, top_start_ratio=0.2,
298 direction='left', distance=400, speed_in_pixels_per_second=5000,
299 element_function='document.getElementsByClassName("message")[2]')
300 interaction.End()
302 def PerformPageInteractions(self, action_runner):
303 self.SwipeToDismiss(action_runner)
306 class Page17(KeySilkCasesPage):
308 def __init__(self, page_set, run_no_page_interactions):
309 super(Page17, self).__init__(
310 url='file://key_silk_cases/inbox_app.html?stress_hidey_bars',
311 page_set=page_set, run_no_page_interactions=run_no_page_interactions)
313 def PerformPageInteractions(self, action_runner):
314 self.StressHideyBars(action_runner)
316 def StressHideyBars(self, action_runner):
317 interaction = action_runner.BeginGestureInteraction(
318 'ScrollAction', is_smooth=True)
319 action_runner.ScrollElement(
320 selector='#messages', direction='down', speed_in_pixels_per_second=200)
321 interaction.End()
322 interaction = action_runner.BeginGestureInteraction(
323 'ScrollAction', is_smooth=True)
324 action_runner.ScrollElement(
325 selector='#messages', direction='up', speed_in_pixels_per_second=200)
326 interaction.End()
327 interaction = action_runner.BeginGestureInteraction(
328 'ScrollAction', is_smooth=True)
329 action_runner.ScrollElement(
330 selector='#messages', direction='down', speed_in_pixels_per_second=200)
331 interaction.End()
334 class Page18(KeySilkCasesPage):
336 def __init__(self, page_set, run_no_page_interactions):
337 super(Page18, self).__init__(
338 url='file://key_silk_cases/inbox_app.html?toggle_drawer',
339 page_set=page_set, run_no_page_interactions=run_no_page_interactions)
341 def PerformPageInteractions(self, action_runner):
342 for _ in xrange(6):
343 self.ToggleDrawer(action_runner)
345 def ToggleDrawer(self, action_runner):
346 interaction = action_runner.BeginInteraction(
347 'Action_TapAction', is_smooth=True)
348 action_runner.TapElement('#menu-button')
349 action_runner.Wait(1)
350 interaction.End()
353 class Page19(KeySilkCasesPage):
355 def __init__(self, page_set, run_no_page_interactions):
356 super(Page19, self).__init__(
357 url='file://key_silk_cases/inbox_app.html?slide_drawer',
358 page_set=page_set, run_no_page_interactions=run_no_page_interactions)
360 def ToggleDrawer(self, action_runner):
361 interaction = action_runner.BeginGestureInteraction(
362 'TapAction', is_smooth=True)
363 action_runner.TapElement('#menu-button')
364 interaction.End()
366 interaction = action_runner.BeginInteraction('Wait', is_smooth=True)
367 action_runner.WaitForJavaScriptCondition('''
368 document.getElementById("nav-drawer").active &&
369 document.getElementById("nav-drawer").children[0]
370 .getBoundingClientRect().left == 0''')
371 interaction.End()
373 def RunNavigateSteps(self, action_runner):
374 super(Page19, self).RunNavigateSteps(action_runner)
375 action_runner.Wait(2)
376 self.ToggleDrawer(action_runner)
378 def PerformPageInteractions(self, action_runner):
379 self.SlideDrawer(action_runner)
381 def SlideDrawer(self, action_runner):
382 interaction = action_runner.BeginInteraction(
383 'Action_SwipeAction', is_smooth=True)
384 action_runner.SwipeElement(
385 left_start_ratio=0.8, top_start_ratio=0.2,
386 direction='left', distance=200,
387 element_function='document.getElementById("nav-drawer").children[0]')
388 action_runner.WaitForJavaScriptCondition(
389 '!document.getElementById("nav-drawer").active')
390 interaction.End()
393 class Page20(KeySilkCasesPage):
395 """ Why: Shadow DOM infinite scrolling. """
397 def __init__(self, page_set, run_no_page_interactions):
398 super(Page20, self).__init__(
399 url='file://key_silk_cases/infinite_scrolling.html',
400 page_set=page_set, run_no_page_interactions=run_no_page_interactions)
402 def PerformPageInteractions(self, action_runner):
403 interaction = action_runner.BeginGestureInteraction(
404 'ScrollAction', is_smooth=True)
405 action_runner.ScrollElement(
406 selector='#container', speed_in_pixels_per_second=5000)
407 interaction.End()
410 class GwsExpansionPage(KeySilkCasesPage):
411 """Abstract base class for pages that expand Google knowledge panels."""
413 def NavigateWait(self, action_runner):
414 super(GwsExpansionPage, self).RunNavigateSteps(action_runner)
415 action_runner.Wait(3)
417 def ExpandKnowledgeCard(self, action_runner):
418 # expand card
419 interaction = action_runner.BeginInteraction(
420 'Action_TapAction', is_smooth=True)
421 action_runner.TapElement(
422 element_function='document.getElementsByClassName("vk_arc")[0]')
423 action_runner.Wait(2)
424 interaction.End()
426 def ScrollKnowledgeCardToTop(self, action_runner, card_id):
427 # scroll until the knowledge card is at the top
428 action_runner.ExecuteJavaScript(
429 "document.getElementById('%s').scrollIntoView()" % card_id)
431 def PerformPageInteractions(self, action_runner):
432 self.ExpandKnowledgeCard(action_runner)
435 class GwsGoogleExpansion(GwsExpansionPage):
437 """ Why: Animating height of a complex content card is common. """
439 def __init__(self, page_set, run_no_page_interactions):
440 super(GwsGoogleExpansion, self).__init__(
441 url='http://www.google.com/#q=google',
442 page_set=page_set, run_no_page_interactions=run_no_page_interactions)
444 def RunNavigateSteps(self, action_runner):
445 self.NavigateWait(action_runner)
446 self.ScrollKnowledgeCardToTop(action_runner, 'kno-result')
449 class GwsBoogieExpansion(GwsExpansionPage):
451 """ Why: Same case as Google expansion but text-heavy rather than image. """
453 def __init__(self, page_set, run_no_page_interactions):
454 super(GwsBoogieExpansion, self).__init__(
455 url='https://www.google.com/search?hl=en&q=define%3Aboogie',
456 page_set=page_set, run_no_page_interactions=run_no_page_interactions)
458 def RunNavigateSteps(self, action_runner):
459 self.NavigateWait(action_runner)
460 self.ScrollKnowledgeCardToTop(action_runner, 'rso')
463 class Page22(KeySilkCasesPage):
465 def __init__(self, page_set, run_no_page_interactions):
466 super(Page22, self).__init__(
467 url='http://plus.google.com/app/basic/stream',
468 page_set=page_set, run_no_page_interactions=run_no_page_interactions)
470 self.credentials = 'google'
472 def RunNavigateSteps(self, action_runner):
473 super(Page22, self).RunNavigateSteps(action_runner)
474 action_runner.WaitForJavaScriptCondition(
475 'document.getElementsByClassName("fHa").length > 0')
476 action_runner.Wait(2)
478 def PerformPageInteractions(self, action_runner):
479 interaction = action_runner.BeginGestureInteraction(
480 'ScrollAction', is_smooth=True)
481 action_runner.ScrollElement(selector='#mainContent')
482 interaction.End()
485 class Page23(KeySilkCasesPage):
488 Why: Physical simulation demo that does a lot of element.style mutation
489 triggering JS and recalc slowness
492 def __init__(self, page_set, run_no_page_interactions):
493 super(Page23, self).__init__(
494 url='http://jsbin.com/UVIgUTa/38/quiet',
495 page_set=page_set, run_no_page_interactions=run_no_page_interactions)
497 def PerformPageInteractions(self, action_runner):
498 interaction = action_runner.BeginGestureInteraction(
499 'ScrollAction', is_smooth=True)
500 action_runner.ScrollPage(
501 distance_expr='window.innerHeight / 2',
502 direction='down',
503 use_touch=True)
504 interaction.End()
505 interaction = action_runner.BeginInteraction('Wait', is_smooth=True)
506 action_runner.Wait(1)
507 interaction.End()
510 class Page24(KeySilkCasesPage):
513 Why: Google News: this iOS version is slower than accelerated scrolling
516 def __init__(self, page_set, run_no_page_interactions):
517 super(Page24, self).__init__(
518 url='http://mobile-news.sandbox.google.com/news/pt0?scroll',
519 page_set=page_set, run_no_page_interactions=run_no_page_interactions)
521 def RunNavigateSteps(self, action_runner):
522 super(Page24, self).RunNavigateSteps(action_runner)
523 action_runner.WaitForJavaScriptCondition(
524 'document.getElementById(":h") != null')
525 action_runner.Wait(1)
527 def PerformPageInteractions(self, action_runner):
528 interaction = action_runner.BeginGestureInteraction(
529 'ScrollAction', is_smooth=True)
530 action_runner.ScrollElement(
531 element_function='document.getElementById(":5")',
532 distance=2500,
533 use_touch=True)
534 interaction.End()
537 class Page25(KeySilkCasesPage):
539 def __init__(self, page_set, run_no_page_interactions):
540 super(Page25, self).__init__(
541 url='http://mobile-news.sandbox.google.com/news/pt0?swipe',
542 page_set=page_set, run_no_page_interactions=run_no_page_interactions)
544 def RunNavigateSteps(self, action_runner):
545 super(Page25, self).RunNavigateSteps(action_runner)
546 action_runner.WaitForJavaScriptCondition(
547 'document.getElementById(":h") != null')
548 action_runner.Wait(1)
550 def PerformPageInteractions(self, action_runner):
551 interaction = action_runner.BeginGestureInteraction(
552 'SwipeAction', is_smooth=True)
553 action_runner.SwipeElement(
554 direction='left', distance=100,
555 element_function='document.getElementById(":f")')
556 interaction.End()
557 interaction = action_runner.BeginInteraction('Wait', is_smooth=True)
558 action_runner.Wait(1)
559 interaction.End()
562 class Page26(KeySilkCasesPage):
564 """ Why: famo.us twitter demo """
566 def __init__(self, page_set, run_no_page_interactions):
567 super(Page26, self).__init__(
568 url='http://s.codepen.io/befamous/fullpage/pFsqb?scroll',
569 page_set=page_set, run_no_page_interactions=run_no_page_interactions)
571 def RunNavigateSteps(self, action_runner):
572 super(Page26, self).RunNavigateSteps(action_runner)
573 action_runner.WaitForJavaScriptCondition(
574 'document.getElementsByClassName("tweet").length > 0')
575 action_runner.Wait(1)
577 def PerformPageInteractions(self, action_runner):
578 interaction = action_runner.BeginGestureInteraction(
579 'ScrollAction', is_smooth=True)
580 action_runner.ScrollPage(distance=5000)
581 interaction.End()
584 class SVGIconRaster(KeySilkCasesPage):
586 """ Why: Mutating SVG icons; these paint storm and paint slowly. """
588 def __init__(self, page_set, run_no_page_interactions):
589 super(SVGIconRaster, self).__init__(
590 url='http://wiltzius.github.io/shape-shifter/',
591 page_set=page_set, run_no_page_interactions=run_no_page_interactions)
593 def RunNavigateSteps(self, action_runner):
594 super(SVGIconRaster, self).RunNavigateSteps(action_runner)
595 action_runner.WaitForJavaScriptCondition(
596 'loaded = true')
597 action_runner.Wait(1)
599 def PerformPageInteractions(self, action_runner):
600 for i in xrange(9):
601 button_func = ('document.getElementById("demo").$.'
602 'buttons.children[%d]') % i
603 interaction = action_runner.BeginInteraction(
604 'Action_TapAction', is_smooth=True)
605 action_runner.TapElement(element_function=button_func)
606 action_runner.Wait(1)
607 interaction.End()
610 class UpdateHistoryState(KeySilkCasesPage):
612 """ Why: Modern apps often update history state, which currently is janky."""
614 def __init__(self, page_set, run_no_page_interactions):
615 super(UpdateHistoryState, self).__init__(
616 url='file://key_silk_cases/pushState.html',
617 page_set=page_set, run_no_page_interactions=run_no_page_interactions)
619 def RunNavigateSteps(self, action_runner):
620 super(UpdateHistoryState, self).RunNavigateSteps(action_runner)
621 action_runner.ExecuteJavaScript('''
622 window.requestAnimationFrame(function() {
623 window.__history_state_loaded = true;
625 ''')
626 action_runner.WaitForJavaScriptCondition(
627 'window.__history_state_loaded == true;')
629 def PerformPageInteractions(self, action_runner):
630 interaction = action_runner.BeginInteraction('animation_interaction',
631 is_smooth=True)
632 action_runner.Wait(5) # JS runs the animation continuously on the page
633 interaction.End()
636 class SilkFinance(KeySilkCasesPage):
638 """ Why: Some effects repaint the page, possibly including plenty of text. """
640 def __init__(self, page_set, run_no_page_interactions):
641 super(SilkFinance, self).__init__(
642 url='file://key_silk_cases/silk_finance.html',
643 page_set=page_set, run_no_page_interactions=run_no_page_interactions)
645 def PerformPageInteractions(self, action_runner):
646 interaction = action_runner.BeginInteraction('animation_interaction',
647 is_smooth=True)
648 action_runner.Wait(10) # animation runs automatically
649 interaction.End()
652 class KeySilkCasesPageSet(page_set_module.PageSet):
654 """ Pages hand-picked for project Silk. """
656 def __init__(self, run_no_page_interactions=False):
657 super(KeySilkCasesPageSet, self).__init__(
658 user_agent_type='mobile',
659 archive_data_file='data/key_silk_cases.json',
660 bucket=page_set_module.PARTNER_BUCKET)
662 self.AddUserStory(Page1(self, run_no_page_interactions))
663 self.AddUserStory(Page2(self, run_no_page_interactions))
664 self.AddUserStory(Page3(self, run_no_page_interactions))
665 self.AddUserStory(Page4(self, run_no_page_interactions))
666 self.AddUserStory(Page5(self, run_no_page_interactions))
667 self.AddUserStory(Page6(self, run_no_page_interactions))
668 self.AddUserStory(Page7(self, run_no_page_interactions))
669 self.AddUserStory(Page8(self, run_no_page_interactions))
670 self.AddUserStory(Page9(self, run_no_page_interactions))
671 self.AddUserStory(Page10(self, run_no_page_interactions))
672 self.AddUserStory(Page11(self, run_no_page_interactions))
673 self.AddUserStory(Page12(self, run_no_page_interactions))
674 self.AddUserStory(Page13(self, run_no_page_interactions))
675 self.AddUserStory(Page14(self, run_no_page_interactions))
676 self.AddUserStory(Page15(self, run_no_page_interactions))
677 self.AddUserStory(Page16(self, run_no_page_interactions))
678 self.AddUserStory(Page17(self, run_no_page_interactions))
679 self.AddUserStory(Page18(self, run_no_page_interactions))
680 # Missing frames during tap interaction; crbug.com/446332
681 # self.AddUserStory(Page19(self, run_no_page_interactions))
682 self.AddUserStory(Page20(self, run_no_page_interactions))
683 self.AddUserStory(GwsGoogleExpansion(self, run_no_page_interactions))
684 self.AddUserStory(GwsBoogieExpansion(self, run_no_page_interactions))
685 # Times out on Windows; crbug.com/338838
686 # self.AddUserStory(Page22(self, run_no_page_interactions))
687 self.AddUserStory(Page23(self, run_no_page_interactions))
688 self.AddUserStory(Page24(self, run_no_page_interactions))
689 self.AddUserStory(Page25(self, run_no_page_interactions))
690 self.AddUserStory(Page26(self, run_no_page_interactions))
691 self.AddUserStory(SVGIconRaster(self, run_no_page_interactions))
692 self.AddUserStory(UpdateHistoryState(self, run_no_page_interactions))
693 self.AddUserStory(SilkFinance(self, run_no_page_interactions))
695 for page in self:
696 assert (page.__class__.RunPageInteractions ==
697 KeySilkCasesPage.RunPageInteractions), (
698 'Pages in this page set must not override KeySilkCasesPage\' '
699 'RunPageInteractions method.')