【发布时间】:2022-01-14 22:59:10
【问题描述】:
我有以下代码:
from abc import ABC
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from webdriver_manager.chrome import ChromeDriverManager
def xpath():
return By.XPATH, '//*'
class BasePage(ABC):
def __init__(self, driver):
self._driver = driver
self._driver.implicitly_wait(10)
self._wait = WebDriverWait(driver, 10)
def wait_for_page_to_load(self):
self._wait.until(self._is_page_ready)
def click_something(self):
self._driver.find_element(*xpath()).click()
self.wait_for_page_to_load()
def _is_page_ready(self):
state = self._driver.execute_script("return document.readyState;")
return state == "complete"
class ChildPage(BasePage):
def __init__(self, driver):
super().__init__(driver)
c = ChildPage(webdriver.Chrome(ChromeDriverManager().install()))
c._driver.get("http://google.com")
c.click_something()
导致错误:
TypeError: _is_page_ready() 接受 1 个位置参数,但给出了 2 个
任何线索为什么它不起作用?解决方法是将 _is_page_ready 设为静态,但这种语法看起来并不错误,所以我很好奇它为什么会抛出这个错误。
【问题讨论】:
-
这与 ABC 或继承无关,您只是将带有错误签名的回调函数(绑定方法
self._is_page_ready)传递给self._wait.until。它想要传递一个论点,但你不期望它。阅读库文档以了解该参数是什么。 -
Selenium Webdriver 是哪一个库文档?我读了它,我没有发现任何相关内容。
-
给出的示例here(在自定义等待条件下)表明驱动程序被传递给回调(它建议应该是一个可调用的类,但这似乎没有必要)。尝试在
_is_page_ready中添加一个额外的参数(可以忽略),看看是否有帮助? -
你说得对,类似这样的工作:
def _is_page_ready(self, x):我在调试中看到 x 是一个 WebDriver。但是为什么 WebDriverWait 对象将 WebDriver 对象传递给 _is_page_ready 函数?我不确定代码中的定义是什么
标签: python python-3.x selenium pytest