How to use test_page_objects method in SeleniumBase

Best Python code snippet using SeleniumBase

test_views.py

Source:test_views.py Github

copy

Full Screen

1# posts/tests/test_views.py2import shutil3import tempfile4from django.conf import settings5from django.core.files.uploadedfile import SimpleUploadedFile6import random7from django.contrib.auth import get_user_model8from django.test import Client, TestCase, override_settings9from django.urls import reverse10from posts.models import Follow, Post, Group, Comment11# Общее количество постов12POSTS_FOR_RANDOM = 2713# количество постов на странице14COUNT_PAGINATOR_ON_PAGE = 915# FIRST и SECOND не менять!16COUNT_FIRST_POST_TEST = 017COUNT_SECOND_POST_TEST = 018# Создаем временную папку для медиа-файлов19# на момент теста медиа папка будет переопределена20TEMP_MEDIA_ROOT = tempfile.mkdtemp(dir=settings.BASE_DIR)21SMALL_GIF = (22 b'\x47\x49\x46\x38\x39\x61\x01\x00\x01\x00\x00\x00\x00\x21\xf9\x04'23 b'\x01\x0a\x00\x01\x00\x2c\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02'24 b'\x02\x4c\x01\x00\x3b'25)26User = get_user_model()27# Для сохранения media-файлов в тестах будет использоваться28# временная папка TEMP_MEDIA_ROOT, а потом мы ее удалим29@override_settings(MEDIA_ROOT=TEMP_MEDIA_ROOT)30class TaskObjectPagesTests(TestCase):31 """32 Тестируем выводимые объекты на страницах33 """34 @classmethod35 def setUpClass(cls) -> None:36 super().setUpClass()37 # создаем запись в БД пользователя38 cls.auth_user = User.objects.create_user(39 username='test_user')40 # создадим запись в модели Group в БД для проведения тестов41 cls.group_for_test = Group.objects.create(42 title='Тестовый заголовок',43 description='Тестовый текст',44 slug='test-slug'45 )46 uploaded = SimpleUploadedFile(47 name='small.gif',48 content=SMALL_GIF,49 content_type='image/gif'50 )51 # создадим пост в модели Post для проведения тестов52 # 1 пост-без Group(slug-рубрики)53 cls.post_one = Post.objects.create(54 text=('Подумайте перед составлением '55 'словаря с шаблонами и адресамиии.'),56 author=cls.auth_user,57 image=uploaded58 )59 # 2 пост-с Group(slug-рубрикой)60 cls.post_two = Post.objects.create(61 text=('Подумайте после составлением'62 ' словаря. Это здорово!'),63 author=cls.auth_user,64 group=cls.group_for_test,65 image=uploaded66 )67 def setUp(self):68 # создаём 2 клиентов69 # первый-неавторизованный. Для проверки доступа там,70 # где требуется авторизация71 self.quest_client = Client()72 # второй-просто авторизованный клиент73 self.authorized_client_auth_user = Client()74 # Авторизовываем клиентов auth_user75 self.authorized_client_auth_user.force_login(self.auth_user)76 @classmethod77 def tearDownClass(cls):78 super().tearDownClass()79 # Модуль shutil - библиотека Python с удобными инструментами80 # для управления файлами и директориями:81 # создание, удаление, копирование, перемещение, изменение папок82 # Метод shutil.rmtree удаляет директорию и всё её содержимое83 shutil.rmtree(TEMP_MEDIA_ROOT, ignore_errors=True) 84 def test_index_page_show_correct_context(self):85 """86 Тестирование правильности отображаемого контента на главной странице87 """88 response = self.authorized_client_auth_user.get(reverse('posts:index'))89 page_objects = response.context['page_obj'][0]90 # создадим словарь с ключами, которые в ответ на запрос к странице91 # в значениях ключа - правильное тестируемое значение92 test_page_objects = {93 page_objects.text: self.post_two.text,94 page_objects.group: self.post_two.group,95 page_objects.author: self.post_two.author,96 page_objects.pub_date: self.post_two.pub_date,97 page_objects.image: self.post_two.image98 }99 # сравниваем со значениями 2-го поста, т.к. он создан последним в тесте100 # во view-функции у нас сортировка по убыванию по дате101 for page_obj, correct_data in test_page_objects.items():102 with self.subTest(page_obj=page_obj):103 self.assertEqual(page_obj, correct_data)104 def test_page_with_detail_post_context(self):105 """106 Тест данных, которые выводит страница при чтении конкретного поста107 """108 # Сортировка постов на странице выполнена по дате (от новых к старым)109 post_id = self.post_two.pk110 response = self.quest_client.get(111 reverse('posts:post_detail', kwargs={112 'slug': self.group_for_test.slug,113 'post_id': post_id}))114 detail_post = response.context['page_obj'][0]115 self.assertEqual(detail_post.text, self.post_two.text)116 self.assertEqual(detail_post.author, self.auth_user)117 self.assertEqual(detail_post.group, self.group_for_test)118 self.assertEqual(detail_post.image, self.post_two.image)119 def test_group_page_show_correct_context(self):120 """121 Тестирование правильности отображаемого контента на странице рубрики122 """123 response = self.authorized_client_auth_user.get(reverse(124 'posts:group_list',125 kwargs={126 'slug': self.group_for_test.slug})127 )128 page_objects = response.context['page_obj'][0]129 # создадим словарь с ключами, которые в ответ на запрос к странице130 # в значениях ключа - правильное тестируемое значение131 test_page_objects = {132 page_objects.text: self.post_two.text,133 page_objects.group: self.post_two.group,134 page_objects.author: self.post_two.author,135 page_objects.pub_date: self.post_two.pub_date,136 page_objects.image: self.post_two.image137 }138 # сравниваем со значениями 2-го поста, т.к. он создан последним в тесте139 # во view-функции у нас сортировка по убыванию по дате140 for page_obj, correct_data in test_page_objects.items():141 with self.subTest(page_obj=page_obj):142 self.assertEqual(page_obj, correct_data)143 def test_author_page_show_correct_context(self):144 """145 Тестирование правильности отображаемого контента146 на странице пользователя147 """148 response = self.authorized_client_auth_user.get(reverse(149 'posts:profile',150 kwargs={151 'username': self.auth_user.username})152 )153 page_objects = response.context['page_obj'][0]154 # создадим словарь с ключами, которые в ответ на запрос к странице155 # в значениях ключа - правильное тестируемое значение156 test_page_objects = {157 page_objects.text: self.post_two.text,158 page_objects.group: self.post_two.group,159 page_objects.author: self.post_two.author,160 page_objects.pub_date: self.post_two.pub_date,161 page_objects.image: self.post_two.image162 }163 # сравниваем со значениями 2-го поста, т.к. он создан последним в тесте164 # во view-функции у нас сортировка по убыванию по дате165 for page_obj, correct_data in test_page_objects.items():166 with self.subTest(page_obj=page_obj):167 self.assertEqual(page_obj, correct_data)168 def test_cach_on_index_page(self):169 """170 Проверяем работает ли кеширование на главной странице171 """172 self.post_for_cach_test = Post.objects.create(173 text=('1111Подумайте перед задолго до pсоставлением '174 'словаря с шаблонами и адресамиии.'),175 author=self.auth_user,176 group=self.group_for_test,177 )178 post_created = Post.objects.filter(id=self.post_for_cach_test.pk)179 # делаем запрос к странице до удаления поста с БД180 response_before = self.quest_client.get(reverse('posts:index'))181 Post.objects.filter(id=self.post_for_cach_test.pk).delete()182 post_empty = Post.objects.filter(id=self.post_for_cach_test.pk)183 # делаем запрос к странице уже после удаления поста184 response_after = self.quest_client.get(reverse('posts:index'))185 self.assertTrue(response_before.content, response_after.content)186 self.assertFalse(post_created, post_empty)187class PaginatorObjectsViewsTest(TestCase):188 @classmethod189 def setUpClass(cls) -> None:190 super().setUpClass()191 # создаем запись в БД пользователя192 cls.auth_user = User.objects.create_user(193 username='test_user')194 cls.auth_user_second = User.objects.create_user(195 username='test_user_second')196 # создадим запись в модели Group в БД для проведения тестов197 cls.group_for_test = Group.objects.create(198 title='Тестовый заголовок',199 description='Тестовый текст',200 slug='test-slug'201 )202 cls.group_for_test_second = Group.objects.create(203 title='Тестовый заголовок Второй',204 description='Тестовый текст Второй',205 slug='test-slug-second'206 )207 # В цикле создаём нужное количество постов для тестов пагинации208 count_posts = POSTS_FOR_RANDOM209 global COUNT_FIRST_POST_TEST210 global COUNT_SECOND_POST_TEST211 while count_posts > 0:212 if count_posts % 2 == 0:213 name_post = 'post_' + str(count_posts)214 cls.name_post = Post.objects.create(215 text=(name_post + ' ') * 2,216 author=cls.auth_user,217 group=cls.group_for_test)218 COUNT_FIRST_POST_TEST += 1219 else:220 name_post_second = 'post_' + str(count_posts)221 cls.name_post_second = Post.objects.create(222 text=(name_post_second + ' ') * 2,223 author=cls.auth_user_second,224 group=cls.group_for_test_second)225 COUNT_SECOND_POST_TEST += 1226 count_posts -= 1227 # создаём 2 клиентов228 # первый-неавторизованный. Для проверки доступа там,229 # где требуется авторизация230 cls.quest_client = Client()231 # второй-просто авторизованный клиент232 cls.authorized_client_auth_user = Client()233 # Авторизовываем клиентов auth_user234 cls.authorized_client_auth_user.force_login(cls.auth_user)235 def test_index_page_contains_nine_records(self):236 """237 Тестирует (паджинатор) количество постов на странице с учетом пагинации238 """239 if POSTS_FOR_RANDOM < COUNT_PAGINATOR_ON_PAGE:240 posts_count = POSTS_FOR_RANDOM241 else:242 posts_count = COUNT_PAGINATOR_ON_PAGE243 response = self.authorized_client_auth_user.get(reverse('posts:index'))244 # Проверка: количество постов на первой странице равно 9.245 # Такое количество задано во view функции246 self.assertEqual(len(response.context['page_obj']),247 posts_count)248 def test_last_page_contains_four_records(self):249 """250 Тестирует (паджинатор) количество постов на251 последней странице Всего постов 22252 """253 if POSTS_FOR_RANDOM > COUNT_PAGINATOR_ON_PAGE and (254 POSTS_FOR_RANDOM < COUNT_PAGINATOR_ON_PAGE*2):255 all_pages = 2256 posts_on_last_page = POSTS_FOR_RANDOM - (257 COUNT_PAGINATOR_ON_PAGE)258 elif POSTS_FOR_RANDOM <= COUNT_PAGINATOR_ON_PAGE:259 all_pages = 1260 posts_on_last_page = POSTS_FOR_RANDOM - (261 COUNT_PAGINATOR_ON_PAGE*0)262 else:263 all_pages = int(POSTS_FOR_RANDOM/COUNT_PAGINATOR_ON_PAGE)264 if (POSTS_FOR_RANDOM % COUNT_PAGINATOR_ON_PAGE) == 0:265 posts_on_last_page = COUNT_PAGINATOR_ON_PAGE266 else:267 posts_on_last_page = POSTS_FOR_RANDOM - (268 COUNT_PAGINATOR_ON_PAGE*all_pages)269 # Проверка: на третьей странице должно быть 4 поста.270 response = self.authorized_client_auth_user.get(271 reverse('posts:index') + f'?page={all_pages + 1}')272 self.assertEqual(len(response.context['page_obj']), posts_on_last_page)273 def test_posts_contains_filter_author(self):274 """275 Тестирует отфильтрованные посты на странице для определённого автора276 """277 # На странице 9 постов, с учетом того, что в response['page_obj']278 # отсчет будет с 0, то для рандома указываем на 1 единицу меньше279 if COUNT_SECOND_POST_TEST >= COUNT_PAGINATOR_ON_PAGE:280 count_posts_on_page_for_random = COUNT_PAGINATOR_ON_PAGE - 2281 else:282 count_posts_on_page_for_random = COUNT_PAGINATOR_ON_PAGE - 3283 response = self.authorized_client_auth_user.get(284 reverse('posts:profile', kwargs={285 'username': self.auth_user_second.username286 }))287 select_post_on_page = response.context['page_obj'][random.randint(288 1, count_posts_on_page_for_random)]289 # проверка случайно выбранного поста, что автором является290 # нужный автор291 self.assertEqual(select_post_on_page.author, self.auth_user_second)292 def test_first_page_contains_records_filter_author_post(self):293 """294 Тестирует (паджинатор) количество постов на странице с295 учетом пагинации и отфильтрованных по пользователю296 """297 if COUNT_SECOND_POST_TEST <= COUNT_PAGINATOR_ON_PAGE:298 count_post = COUNT_SECOND_POST_TEST299 else:300 count_post = COUNT_PAGINATOR_ON_PAGE301 response = self.authorized_client_auth_user.get(302 reverse('posts:profile', kwargs={303 'username': self.auth_user_second.username304 }))305 # Проверка: количество постов на первой странице равно 9.306 # Такое количество задано во view функции307 self.assertEqual(len(308 response.context['page_obj']), count_post)309 def test_last_page_contains_records_filter_author_post(self):310 """311 Тестирует (паджинатор) количество постов на последней странице312 с учетом пагинации и отфильтрованных по пользователю.313 На последней странице314 """315 if COUNT_SECOND_POST_TEST > COUNT_PAGINATOR_ON_PAGE and (316 COUNT_SECOND_POST_TEST < COUNT_PAGINATOR_ON_PAGE*2):317 all_pages = 2318 posts_on_last_page = COUNT_SECOND_POST_TEST - (319 COUNT_PAGINATOR_ON_PAGE)320 elif COUNT_SECOND_POST_TEST < COUNT_PAGINATOR_ON_PAGE:321 all_pages = 1322 posts_on_last_page = COUNT_SECOND_POST_TEST - (323 COUNT_PAGINATOR_ON_PAGE*0)324 else:325 all_pages = int(COUNT_SECOND_POST_TEST/COUNT_PAGINATOR_ON_PAGE)326 posts_on_last_page = COUNT_SECOND_POST_TEST - (327 COUNT_PAGINATOR_ON_PAGE*all_pages)328 if posts_on_last_page == 0:329 posts_on_last_page = 9330 response = self.authorized_client_auth_user.get(331 reverse('posts:profile', kwargs={332 'username': self.auth_user_second.username333 }) + f'?page={all_pages+1}')334 # Всего постов этого автора 11. На первой странице - 9 постов335 # ,а на второй - будет 2 поста336 self.assertEqual(len(337 response.context['page_obj']), posts_on_last_page)338 def test_posts_with_filter_group(self):339 """340 Тестирует пост на странице отфильтрованные по определенной341 рубрике (group/slug) - другой рубрики быть не должно!342 """343 # На странице 9 постов, с учетом того, что в response['page_obj']344 # отсчет будет с 0, то для рандома указываем на 1 единицу меньше345 if COUNT_SECOND_POST_TEST >= COUNT_PAGINATOR_ON_PAGE:346 count_posts_on_page_for_random = COUNT_PAGINATOR_ON_PAGE - 2347 else:348 count_posts_on_page_for_random = COUNT_PAGINATOR_ON_PAGE - 3349 response = self.authorized_client_auth_user.get(350 reverse('posts:group_list', kwargs={351 'slug': self.group_for_test_second.slug}))352 select_post_on_page = response.context['page_obj'][random.randint(353 1, count_posts_on_page_for_random)]354 # проверка группы у случайно выбранного поста355 # <Group: Тестовый заголовок Второй>356 self.assertEqual(select_post_on_page.group,357 self.group_for_test_second)358 def test_first_page_contains_nine_records_filter_group_post(self):359 """360 Тестирует (паджинатор) на начальной странице выбронной группы (рубрики)361 """362 if COUNT_SECOND_POST_TEST < COUNT_PAGINATOR_ON_PAGE:363 count_posts_on_page = COUNT_SECOND_POST_TEST364 else:365 count_posts_on_page = COUNT_PAGINATOR_ON_PAGE366 # slug=test-slug-second - url второй'367 response = self.quest_client.get(368 reverse('posts:group_list', kwargs={369 'slug': self.group_for_test_second.slug}))370 self.assertEqual(len(response.context['page_obj']),371 count_posts_on_page)372 def test_last_page_contains_records_filter_group_post(self):373 """374 Тестирует (паджинатор) на последней странице выбронной группы (рубрики)375 """376 if COUNT_SECOND_POST_TEST > COUNT_PAGINATOR_ON_PAGE and (377 COUNT_SECOND_POST_TEST < COUNT_PAGINATOR_ON_PAGE*2):378 all_pages = 2379 posts_on_last_page = COUNT_SECOND_POST_TEST - (380 COUNT_PAGINATOR_ON_PAGE)381 elif COUNT_SECOND_POST_TEST < COUNT_PAGINATOR_ON_PAGE:382 all_pages = 1383 posts_on_last_page = COUNT_SECOND_POST_TEST - (384 COUNT_PAGINATOR_ON_PAGE*0)385 else:386 all_pages = int(COUNT_SECOND_POST_TEST/COUNT_PAGINATOR_ON_PAGE)387 posts_on_last_page = COUNT_SECOND_POST_TEST - (388 COUNT_PAGINATOR_ON_PAGE*all_pages)389 if posts_on_last_page == 0:390 posts_on_last_page = 9391 # slug='test-slug-second'392 response = self.quest_client.get(393 reverse('posts:group_list', kwargs={394 'slug': self.group_for_test_second.slug}395 ) + f'?page={all_pages+1}')396 self.assertEqual(len(response.context['page_obj']),397 posts_on_last_page)398class CommentsViewsTest(TestCase):399 """400 Проверяем, что:401 ---------------402 - Комментировать посты может только авторизованный пользователь;403 - После успешной отправки комментарий появляется на странице поста.404 """405 @classmethod406 def setUpClass(cls):407 super().setUpClass()408 uploaded = SimpleUploadedFile(409 name='small.gif',410 content=SMALL_GIF,411 content_type='image/gif'412 )413 cls.user = User.objects.create(414 username='test-user'415 )416 cls.group = Group.objects.create(417 title='Тестовый заголовок',418 description='Тестовый текст',419 slug='test-slug'420 )421 cls.post_one = Post.objects.create(422 text=('В базе данных проекта Yatube уже хранится информация'423 'об авторах и их постах. Дадим пользователям '424 'возможность комментировать записи друг друга.'),425 author=cls.user,426 group=cls.group,427 image=uploaded428 )429 cls.quest_user = Client()430 cls.auth_user = Client()431 cls.auth_user.force_login(cls.user)432 def test_create_comment_only_auth_user(self):433 """434 Тестирование комментирования поста - только авторизованные435 """436 comments_count_first = Comment.objects.count()437 text_comment = {438 'text': 'Первый комментарий, к этому чудесному тесту',439 'post': self.post_one,440 'author': self.user}441 response = self.auth_user.post(reverse(442 'posts:add_comment',443 kwargs={'post_id': self.post_one.pk}),444 data=text_comment,445 follow=True)446 comments_count_second = Comment.objects.count()447 self.assertTrue(comments_count_second, (comments_count_first+1))448 self.assertRedirects(response, reverse(449 'posts:post_detail',450 kwargs={451 'slug': self.group.slug,452 'post_id': self.post_one.pk453 }))454 def test_comment_on_page(self):455 self.comment_on_page = Comment.objects.create(456 text='Первый комментарий, к этому чудесному тесту',457 post=self.post_one,458 author=self.user459 )460 response = self.quest_user.get(reverse(461 'posts:post_detail',462 kwargs={463 'slug': self.group.slug,464 'post_id': self.post_one.pk465 }))466 page_objects = response.context['page_obj'][0]467 self.assertTrue(page_objects.comments, self.comment_on_page.text)468class FollowingViewsTest(TestCase):469 """470 Проверяем, что:471 ---------------472 - Авторизованный пользователь может подписываться на других473 пользователей и удалять их из подписок.474 - Новая запись пользователя появляется в ленте тех, кто на него475 подписан.476 """477 @classmethod478 def setUpClass(cls) -> None:479 super().setUpClass()480 cls.user_1 = User.objects.create(481 username='test-user'482 )483 cls.user_2 = User.objects.create(484 username='test-user-2'485 )486 cls.user_3 = User.objects.create(487 username='test-user-3'488 )489 cls.group = Group.objects.create(490 title='Тестовый заголовок',491 description='Тестовый текст',492 slug='test-slug'493 )494 cls.post_one = Post.objects.create(495 text=('Yatube уже хранится информация'496 'об авторах и их постах. Дадим пользователям '497 'возможность комментировать записи друг друга.'),498 author=cls.user_1,499 group=cls.group500 )501 cls.post_two = Post.objects.create(502 text=('базе данных проекта Yatube уже хранится информация'503 'об авторах и их постах. Дадим пользователям '504 'возможность друга.'),505 author=cls.user_2,506 group=cls.group507 )508 cls.post_three = Post.objects.create(509 text=('данных проекта хранится информация'510 'об авторах и их постах. Дадим пользователям '511 'возможность комментировать записи друг друга.'),512 author=cls.user_3,513 group=cls.group514 )515 cls.auth_user_one = Client()516 cls.auth_user_one.force_login(cls.user_1)517 cls.auth_user_two = Client()518 cls.auth_user_two.force_login(cls.user_2)519 cls.client_user_three = Client()520 def test_follow_other_author(self):521 """522 Тестируем подписку "user_1" на "user_3"523 """524 # будет False525 is_follow_firsttime = Follow.objects.filter(526 author=self.user_3, user=self.user_1).exists()527 response = self.auth_user_one.get(528 reverse('posts:profile_follow',529 kwargs={530 'username': self.user_3.username,531 }))532 # будет True533 is_follow_secondtime = Follow.objects.filter(534 author=self.user_3, user=self.user_1).exists()535 self.assertRedirects(response, reverse('posts:profile',536 kwargs={'username': self.user_3.username, }))537 self.assertEqual(is_follow_firsttime, False)538 self.assertEqual(is_follow_secondtime, True)539 def test_unfollow_other_author(self):540 """541 Тестируем удаление из подписок ("user_1" удаляет подписку на "user_3")542 """543 pass544 self.start_following = Follow.objects.create(545 author=self.user_3, user=self.user_1)546 # "is_follow_firsttime" должна быть True547 is_follow_firsttime = Follow.objects.filter(548 author=self.user_3, user=self.user_1).exists()549 response = self.auth_user_one.get(550 reverse('posts:profile_unfollow',551 kwargs={552 'username': self.user_3.username,553 }))554 # будет False555 is_follow_secondtime = Follow.objects.filter(556 author=self.user_3, user=self.user_1).exists()557 self.assertRedirects(response, reverse('posts:profile',558 kwargs={'username': self.user_3.username, }))559 self.assertEqual(is_follow_firsttime, True)560 self.assertEqual(is_follow_secondtime, False)561 def test_posts_on_follow_user(self):562 """563 Тестируем видимость постов в ленте подписчика (у "user_1" в ленте564 должны появиться посты "user_3")565 """566 self.start_following = Follow.objects.create(567 author=self.user_3, user=self.user_1)568 response = self.auth_user_one.get(569 reverse('posts:follow_index'))570 # берём текст первого поста, автора, на которого подписались571 text_post_user_3 = response.context['page_obj'][0].text572 author_post_user_3 = response.context['page_obj'][0].author573 # и сравниваем с текстом автора "user_3"574 self.assertEqual(text_post_user_3, self.post_three.text)...

Full Screen

Full Screen

test_page_objects.py

Source:test_page_objects.py Github

copy

Full Screen

...19 sb.click('[for="__search"] svg')20 sb.type('form[name="search"] input', search_term)21 sb.click("li.md-search-result__item h1:contains(%s)" % search_term)22class MyTests(BaseCase):23 def test_page_objects(self):24 search_term = "SeleniumBase GitHub"25 expected_text = "seleniumbase/SeleniumBase"26 GooglePage().go_to_google(self)27 GooglePage().do_search(self, search_term)28 self.assert_text(expected_text, "#search")29 GooglePage().click_search_result(self, expected_text)30 SeleniumBaseGitHubPage().click_seleniumbase_io_link(self)31 SeleniumBaseIOPage().do_search_and_click(self, "Dashboard")...

Full Screen

Full Screen

Automation Testing Tutorials

Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.

LambdaTest Learning Hubs:

YouTube

You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.

Run SeleniumBase automation tests on LambdaTest cloud grid

Perform automation testing on 3000+ real desktop and mobile devices online.

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful