我的问题来自于试图理解下面的代码(这意味着等待页面上加载特定元素后再继续):
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
# ... start chromium_driver
wait_timeout = 10
wait = WebDriverWait(chromium_driver, wait_timeout)
target_id = "CookiePopup"
target_element = wait.until(EC.presence_of_element_located((By.ID, target_id)))
我可以理解定位器在概念上是什么(“a way to identify elements on a page“),但是我试图在这个上下文中把它的结构和规范作为一个对象(即EC.presence_of_element_located(locator)
的签名)。注意,上面代码中的(By.ID, target_id)
部分**需要用括号括起来;即,
EC.presence_of_element_located(By.ID, target_id)
成因
TypeError: __init__() takes 2 positional arguments but 3 were given
文档解释说“[locator]是传递给Finding元素方法的参数”。
Finding element methods页面显示Python中的find_element()
方法有两个参数,这是我觉得有点混乱的部分:
vegetable = driver.find_element(By.CLASS_NAME, "tomatoes")
此外,By.CLASS_NAME
、By.ID
等实际上是包含字符串(分别为“类名”和“id”)的属性。
将此代码与Java(或任何其他语言)代码进行比较:
WebElement vegetable = driver.findElement(By.className("tomatoes"));
这就更合理了By.className()
是一个方法,它将(HTML)类名作为参数,并返回一个定位器对象,该对象将元素与该类名匹配。
鉴于以上所述,将 locator 描述为两个 str 的 tuple 是否准确,其中第一个字符串是所使用的标识符的类型,第二个字符串是该标识符的值?作为后续问题,为什么Python在这方面与其他语言不同?
1条答案
按热度按时间juud5qan1#
文档并没有说明(至少对我来说)为什么必须传递括号中的参数,但是请在这里查看该函数的源代码:
https://www.selenium.dev/selenium/docs/api/py/_modules/selenium/webdriver/support/expected_conditions.html#presence_of_element_located
您可以看到,在presence_of_element_located()的实现中,它接受作为定位器传递的任何内容,并在对
find_element(*locator)
的调用中传递该参数注意,星号(*)在Python中用于解包元组(或任何可迭代对象)的内容,要了解更多信息,请参见下面的答案:
https://stackoverflow.com/a/1993732