首页 > 解决方案 > Selenium Python Pytest 使用参数化测试测试网页。ElementClickInterceptedException

问题描述

除了导致 ElementClickInterceptedException 的“31”之外,所有参数都按预期运行相同的测试

基本上,此测试必须检查用户名字段的最大和最小输入长度,并且作为预期结果,p[class="validation-message ng-star-inserted"]只有在不接受长度并且断言消息出现在运行此命令的控制台中时,才必须出现css 选择器的元素代码

我的测试文件:

import pytest
import sys
import time
from selenium.webdriver.common.by import By
from pages.main_page import MainPage

link = "https://rozetka.com.ua/"
test_len_list = [str(num) for num in range(0,100)] 
test_len_list = ['a' for num in range(0, 33)] 
test_len_str = "".join(test_len_list)

class TestRegisterPage():
    @pytest.mark.len
@pytest.mark.parametrize('num', [0, 1, 2, 31, 32, 64, 128,256])
def test_field_username_len(self, browser, num):
    # is it functional testing if I need to make a sequence of steps before reaching to the element I need to test
    # Because if some step from this sequence won't work the entire test fails

    if num <= 0:
        field_value = ''
    else:
        test_len_list = ['в' for b in range(0,
                                            num)]  
        field_value = "".join(test_len_list)
    page = MainPage(browser, link)

    #check if internet connection is present
    if not has_connection(page.browser):
        print('No Internet connection, aborted!')
        page.browser.quit()
    else:
        page.open()

        log_in_btn = page.browser.find_element_by_css_selector("button[class='header__button ng-star-inserted'][type='button']")
        log_in_btn.click()
        register_btn = page.browser.find_element_by_css_selector("a[class='auth-modal__register-link ng-star-inserted']")
        register_btn.click()
        # time.sleep(3)
        username_input = page.browser.find_element_by_css_selector("input[id='registerUserName']")
        username_input.send_keys(field_value)
        time.sleep(3)
        assert page.is_element_present(
            'p[class="validation-message ng-star-inserted"]') == False, "Lenght does not satisfy the requirements"

我的主页文件:

from .base_page import BasePage
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

class MainPage(BasePage):

    def click_alert(self):
        main_window = self.browser.window_handles[0]
        WebDriverWait(self.browser, 5).until(EC.alert_is_present())
        alert = self.browser.switch_to.alert
        alert.accept()
        self.browser.switch_to.window(main_window)

    def find_login_button(self):
        return self.browser.find_element_by_css_selector("button[class='header__button ng-star-inserted'][type='button']")

    def find_register_button(self):
        return self.browser.find_element_by_css_selector("a[class='auth-modal__register-link ng-star-inserted']")

我的 BasePage 文件:

from selenium.common.exceptions import NoSuchElementException


class BasePage:
    def __init__(self, browser, url, timeout=30):
        self.browser = browser
        self.url = url
        self.browser.implicitly_wait(timeout)

    def open(self):
        self.browser.get(self.url)

    def is_element_present(self, css_selector):
        try:
            self.browser.find_element_by_css_selector(css_selector)
        except NoSuchElementException:
            return False
        return True

类型为 int测试用例参数 31的值“31”的测试结果屏幕截图

标签: pythonseleniumtestingautomation

解决方案


您是否尝试过使用 JS 点击?

element = driver.find_element_by_id("myid")
driver.execute_script("arguments[0].click();", element)

用上面的替换你的点击功能并尝试。

log_in_btn = page.browser.find_element_by_css_selector("button[class='header__button ng-star-inserted'][type='button']")
driver.execute_script("arguments[0].click();", log_in_btn )

register_btn = page.browser.find_element_by_css_selector("a[class='auth-modal__register-link ng-star-inserted']")
driver.execute_script("arguments[0].click();", register_btn)

推荐阅读