包装Selenium“预期条件”Python

时间:2014-09-09 11:16:53

标签: python selenium

我正在尝试使用自定义函数创建自己的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部分作为参数传递给我的函数? 希望我能很好地描述我的情况。如果我不是,我会很乐意澄清。

3 个答案:

答案 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导入