Selenium Python Pytest 使用参数化测试测试网页。 ElementClickInterceptedException

Selenium Python Pytest testing a web page using parametrized tests. ElementClickInterceptedException

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

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

的控制台中

我的测试文件:

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”的测试结果截图 test case param 31

你试过用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)