我正在尝试用自定义函数创建自己的selenium类,以便测试脚本在某些场景中变得更直观和更健壮,至少对我来说是这样。我当前的任务之一是包装所有Selenium预期条件(如here所述),以便最终拥有一个类似的函数:
def waitForElement(self, elementName, expectedCondition, searchBy)
哪里:
elementName
-我要查找的元素的名称。可以是id、name、xpath、css等等……expectedCondition
-这是设置硒预期条件的地方。所以可以是:元素可以点击,元素的可见性,等等…上述函数在内部实现标准的Selenium
WebDriverWait
如下:try:
if expectedCondition == "element_to_be_clickable":
element = WebDriverWait(self.driver, defaultWait).until(EC.element_to_be_clickable((searchBy, elementName)))
elif expectedCondition == "visibility_of_element_located":
element = WebDriverWait(self.driver, defaultWait).until(EC.visibility_of_element_located((searchBy, elementName)))
一切都很好,但是我有一点麻烦把
searchBy
作为参数传递要提醒您,searchBy
可以是以下之一:By.ID
By.NAME
By.CLASS_NAME
...
当我从主代码调用这个包装函数时,我使用下面的一行:
self.waitForElement("elementName", "element_to_be_clickable", "By.NAME", "test")
因此,所有参数都作为字符串传递,这对除
searchBy
部分之外的所有内容都很好。所以我的问题是:如何将
By.X
部分作为参数传递给函数?希望我能很好地描述我的处境。如果我没有,我很乐意澄清。
最佳答案
最后,我问了this个问题,终于解决了这个问题。因此,为了获得所需的功能,上述方法将如下所示:
def waitForElement(self, elementName, expectedCondition, searchBy):
try:
if expectedCondition == "element_to_be_clickable":
element = WebDriverWait(self.driver, self.defaultWait).until(EC.element_to_be_clickable((getattr(By, searchBy), elementName)))
elif expectedCondition == "visibility_of_element_located":
element = WebDriverWait(self.driver, self.defaultWait).until(EC.visibility_of_element_located((getattr(By, searchBy), elementName)))
. . .
所以可以这样称呼:
self.waitForElement("elementName", "element_to_be_clickable", "NAME")