Selenium - 将文件上传到iframe

时间:2015-04-29 10:16:59

标签: python selenium iframe selenium-webdriver upload

我有一个测试,其中包含位于iframe的表单上传文件的方法。

问题是测试不稳定,有时会因错误而失败(运行三次以获取错误示例,第三次运行失败):

def fill_offer_image(self):
    driver = self.app.driver
    driver.switch_to.frame(driver.find_elements_by_name("upload_iframe")[3])
E       IndexError: list index out of range

我有implicitly wait = 10,因为你可以考虑页面上有几个相同类的iframe,所以我被迫使用数组。有时并非所有(或所有?)iframe都已加载。

有人有想法如何提高测试的稳定性吗? 它可能与iframe本身的机制有关吗?

2 个答案:

答案 0 :(得分:2)

我会使用Explicit Wait等待name="upload_iframe"的框架元素数量变为4 ,方法是写custom expected condition

from selenium.common.exceptions import StaleElementReferenceException
from selenium.webdriver.support import expected_conditions as EC

class wait_for_n_elements(object):
    def __init__(self, locator, count):
        self.locator = locator
        self.count = count

    def __call__(self, driver):
        try:
            count = len(EC._find_elements(driver, self.locator))
            return count == self.count
        except StaleElementReferenceException:
            return False

用法:

wait = WebDriverWait(driver, 10)
wait.until(wait_for_n_elements((By.NAME, 'upload_iframe'), 4))

driver.switch_to.frame(driver.find_elements_by_name("upload_iframe")[3])  

答案 1 :(得分:1)

让我们通过插入以下代码

为iframe加载一些时间来尝试这个
Import time

## Give time for iframe to load ##
time.sleep(xxx)

希望这会有用