“包装硒”;“预期条件”;python
我正在尝试使用自定义函数创建自己的Selenium类,以便测试脚本在某些场景中变得更加直观和健壮,至少对我来说是这样。我当前的任务之一是包装所有Selenium预期条件(如上所述),以便最终生成一个类似以下内容的函数:“包装硒”;“预期条件”;python,python,selenium,Python,Selenium,我正在尝试使用自定义函数创建自己的Selenium类,以便测试脚本在某些场景中变得更加直观和健壮,至少对我来说是这样。我当前的任务之一是包装所有Selenium预期条件(如上所述),以便最终生成一个类似以下内容的函数: def waitForElement(self, elementName, expectedCondition, searchBy) 其中: elementName-我要查找的元素的名称。可以是id、名称、xpath、css等 expectedCondition-这是设置Sel
def waitForElement(self, elementName, expectedCondition, searchBy)
其中:
elementName
-我要查找的元素的名称。可以是id、名称、xpath、css等
expectedCondition
-这是设置Selenium预期条件的地方。所以可以是:元素可点击,元素所在位置的可见性,等等
上述函数在内部实现标准SeleniumWebDriverWait
,如下所示:
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
部分作为参数传递给函数?
希望我能很好地描述我的情况。如果我不是,我很乐意澄清。你可以这样开始: 创建按实例接受的主findElement方法: 然后创建使用findElement方法的wait方法: 并通过实例传递给findElementAndWaitElementToPresent方法: 或
类似的事情是在我正在研究/使用的框架中完成的最终,在提出问题后,我能够解决这个问题。因此,为了获得所需的功能,上述方法将如下所示:
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")
所以可以这样称呼:
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")
代码的问题是您正在将“By”数据类型转换为字符串 简单的方法是不加引号地传递它,如下所示: self.waitForElement(“elementName”,“element可点击”,By.NAME,“test”) 您需要做的另一件事是在python模块中添加导入,如下所示,从中调用上述方法:
来自selenium.webdriver.common.by import by您好,谢谢您的回答,但我想用Python提供一个解决方案。哦,对不起:)但是Python也有您可以使用的Webelement模块。我向您建议了一个如何实现它的结构
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")