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中使用它,它将不起作用
谢谢,里亚兹
在这种情况下,*
是参数解包运算符。它告诉 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)
归档时间: |
|
查看次数: |
803 次 |
最近记录: |