我正在尝试使用自定义函数创建自己的Selenium类,以便测试脚本在某些情况下会变得更直观,更健壮,至少我的品味。我当前的任务之一是包装所有Selenium预期条件(描述为here),以便最终我将拥有一个看起来像这样的函数:
def waitForElement(self, elementName, expectedCondition, searchBy)
其中:
elementName
- 我要找的元素的名称。那可能是id,name,xpath,css等......
expectedCondition
- 这是设置Selenium预期条件的地方。所以这可以是:element_to_be_clickable,visibility_of_element_located等......
上述函数在内部实现标准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
部分作为参数传递给我的函数?
希望我能很好地描述我的情况。如果我不是,我会很乐意澄清。
答案 0 :(得分:1)
最终我在询问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")
答案 1 :(得分:0)
你可以这样开始:
创建主要的findElement方法,该方法接受By实例:
WebElement findElement(By by) {
try {
return driver.findElement(by);
} catch (NoSuchElementException e) {
logException("ERROR: Could not find - '" + by + "' on page " + driver.getCurrentUrl());
throw e;
}
然后创建使用findElement方法的wait方法:
WebElement findElementAndWaitElementToPresent(By by, int timeoutInSeconds) {
try {
WebDriverWait wait = new WebDriverWait(driver, timeoutInSeconds);
wait.until(ExpectedConditions.presenceOfElementLocated(by));
return findElement(by);
} catch (TimeoutException e) {
logException("ERROR: Element is not present: " + by + " on page " + driver.getCurrentUrl());
throw e;
}
}
并将By实例传递给findElementAndWaitElementToPresent方法:
findElementAndWaitElementToPresent(By.xpath("//your_xpath"), 10);
或
findElementAndWaitElementToPresent(By.name("name"), 10);
这样的事情是在我正在使用
的框架中完成的答案 2 :(得分:0)
您的代码问题在于您将“By”数据类型转换为字符串。
简单的方法是在没有引号的情况下传递它,如下所示:
self.waitForElement(“elementName”,“element_to_be_clickable”,By.NAME,“test”)
你需要做的另外一件事就是在python模块中为你调用上面的方法添加如下所示的导入方法:
来自selenium.webdriver.common.by导入