Python中的Selenium定位器具体是什么?

yvgpqqbh  于 2023-01-19  发布在  Python
关注(0)|答案(1)|浏览(142)

我的问题来自于试图理解下面的代码(这意味着等待页面上加载特定元素后再继续):

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_NAMEBy.ID等实际上是包含字符串(分别为“类名”和“id”)的属性。
将此代码与Java(或任何其他语言)代码进行比较:

WebElement vegetable = driver.findElement(By.className("tomatoes"));

这就更合理了By.className()是一个方法,它将(HTML)类名作为参数,并返回一个定位器对象,该对象将元素与该类名匹配。
鉴于以上所述,将 locator 描述为两个 strtuple 是否准确,其中第一个字符串是所使用的标识符的类型,第二个字符串是该标识符的值?作为后续问题,为什么Python在这方面与其他语言不同?

juud5qan

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

相关问题