Selenium Webdriver Python页面对象MainPageLocators类为什么在类名的前面使用星号

Ria*_*ani 5 selenium python-2.7 selenium-webdriver

我一直在使用Python进行Selenium Webdriver测试的页面对象模型。我遵循了GitHub上的示例。网址是:https : //github.com/baijum/selenium-python/blob/master/source/page-objects.rst

当您从MainPageLocators类(例如,从URL)中调用定位器时。

element = self.driver.find_element(*MainPageLocators.GO_BUTTON)
Run Code Online (Sandbox Code Playgroud)

它在类名* MainPageLocators前面使用星号。为什么使用*?

如果使用MainPageLocators,则不起作用,必须使用* MainPageLocators。

这不好,因为当我使用WebDriverWait时,它不适用于* MainPageLocators或MainPageLocators。例如

element = WebDriverWait(self.driver, 20).until(EC.element_to_be_clickable((*MainPageLocators.locator)))
Run Code Online (Sandbox Code Playgroud)

我必须以这种方式进行操作才能正常工作,这使将定位器放在一个地方的目的无法实现。

element = WebDriverWait(self.driver, 20).until(EC.element_to_be_clickable((By.ID, 'button_id')))
Run Code Online (Sandbox Code Playgroud)

为什么在MainPageLocators前面加星号?为什么* MainPageLocators在WebDriverWait内部不起作用?如果你做的话就可以了

self.driver.find_element(* MainPageLocators.locator)

但是,如果在WebDriverWait中使用它,它将不起作用

谢谢,里亚兹

unu*_*tbu 3

在这种情况下,*参数解包运算符。它告诉 Python 将后面的序列中的值解压并将它们作为参数传递给函数。例如,

foo(*(1, 2, 3))
Run Code Online (Sandbox Code Playgroud)

相当于

foo(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

因为MainPageLocators.GO_BUTTON定义如下:

class MainPageLocators(object):
    """A class for main page locators. All main page locators should come here"""
    GO_BUTTON = (By.ID, 'submit')
Run Code Online (Sandbox Code Playgroud)

由此可见,find_element(*MainPageLocators.GO_BUTTON)相当于

find_element(By.ID, 'submit')
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为find_element 需要 2 个参数


相反,EC.element_to_be_clickable 期望单个 2 元组作为其参数。因此,您不想在此处使用参数解包运算符。相反,只需直接传递 2 元组即可:

wait = WebDriverWait(self.driver, 20)
element = wait.until(EC.element_to_be_clickable((By.ID, 'submit'))
Run Code Online (Sandbox Code Playgroud)

或使用

element = wait.until(EC.element_to_be_clickable(MainPageLocators.GO_BUTTON)
Run Code Online (Sandbox Code Playgroud)