当前位置: 首页 > 知识库问答 >
问题:

Python Selenium Web驱动程序。写下我自己的期望状态

乐正德华
2023-03-14

我正在试着写我自己的期望条件。我需要的是。。。我有一个iframe。我也有一个图像在里面。我想在图像的scr发生变化时继续处理。我所做的:

class url_changed_condition(object):
    '''
    Checks whether url in iframe has changed or not
    '''
    def __init__(self, urls):
        self._current_url, self._new_url = urls

    def __call__(self, ignored):
        return self._current_url != self._new_url  

在后面的代码中,我有:

def process_image(self, locator, current_url):
    try:
        WebDriverWait(self.driver, 10).until(ec.presence_of_element_located((By.TAG_NAME, u"iframe")))
        iframe = self.driver.find_element(*locator)
        if iframe:
            print "Iframe found!"
        self.driver.switch_to_frame(iframe)
        WebDriverWait(self.driver, 10).until(ec.presence_of_element_located((By.XPATH, u"//div")))

        # WebDriverWait(self.driver, 10).until(
            # url_changed_condition(
                # (current_url, self.driver.find_element(By.XPATH, u"//a/img").get_attribute(u"src"))))

        img_url = self.driver.find_element(By.XPATH, u"//a/img").get_attribute(u"src")
        print img_url
        self.search_dict[self._search_item].append(img_url)
        self.driver.switch_to_default_content()
    except NoSuchElementException as NSE:
        print "iframe not found! {0}".format(NSE.msg)
    except:
        print "something went wrong"
        import traceback
        import sys
        type_, value_, trace_ = sys.exc_info()
        print type_, value_
        print traceback.format_tb(trace_)
    finally:
        return current_url  

此代码工作,但返回相同的url多次。问题是当我取消注释url_changed_condition时,它与
(current_url,self.driver.find_element(By.XPATH,u"//a/img")。get_attribute(u"src"))
它下面的行工作正常...我不明白。

共有3个答案

江光明
2023-03-14

根据文件:

默认情况下,WebDriverWait每500毫秒调用一次ExpectedCondition,直到它成功返回。对于所有其他ExpectedCondition类型,成功返回的值为布尔返回true或非null。

如果您注释掉自定义等待,那么多次获得相同的URL这一事实应该会给您一个提示。

\uuu call\uuu()中,您总是返回False,因为URL从未更改。由于您返回的是False,因此预期的条件永远不会满足,您会得到TimeoutException

因此,要么重新定义预期条件逻辑,要么针对不同的情况进行测试。

岳玉书
2023-03-14

使用@alecxe描述的技术,但稍加修改以应对接受元素而不是定位器的expected_conditions:(在这种情况下,因为没有selenium.webdriver.support.expected_conditions.invisibility_of(元素),我正在等待is_displayed()方法发出信号False)

class wait_for_element_to_be_invisible(object):
    def __init__(self, element):
        self.element = element

    def __call__(self, driver):
        return not(self.element.is_displayed())

def test_collapsible_blocks_expand_or_collapse(self):
    self.browser.get(self.server_url+'/courses/1/')
    shadables = self.browser.find_elements_by_class_name('shade')
    for shadable in shadables:
        ## parent, then sibling element (*)
        shady_bit = shadable.find_element_by_xpath('../following-sibling::*')
        element = WebDriverWait(self.browser, 10).until(
            EC.visibility_of(shady_bit))
        shadable.click()
        element = WebDriverWait(self.browser, 10).until(
            self.wait_for_element_to_be_invisible(shady_bit))

包含DOM相关位的HTML片段为:

<h4 class="shadable"><span class="shade" title="Show/Hide">↓</span>
  <a href="/link/to/uri">Title of Section</a>
</h4>
<article class="abstract">
  <p>Descriptive part which is shadable
  </p>
</article>`
欧阳元魁
2023-03-14

本主题似乎遗漏了自定义预期条件的示例。

这实际上很容易。首先,什么是Python硒绑定的预期条件:

  • 它是一种新型的(基于对象
  • 它定义了\uuuu call\uuuu()魔术方法,该方法返回布尔值

有一大套内置的预期条件类。

让我们通过示例来学习。假设我们希望等待元素的文本以所需文本开始:

from selenium.webdriver.support import expected_conditions as EC

class wait_for_text_to_start_with(object):
    def __init__(self, locator, text_):
        self.locator = locator
        self.text = text_

    def __call__(self, driver):
        try:
            element_text = EC._find_element(driver, self.locator).text
            return element_text.startswith(self.text)
        except StaleElementReferenceException:
            return False

使用方法:

WebDriverWait(driver, 10).until(wait_for_text_to_start_with((By.ID, 'myid'), "Hello, World!"))
 类似资料:
  • 我正在尝试创建一个简单的应用程序,它将我站点上每个网页的页面视图写给Cassandra。我想写每5分钟的累积页面浏览量从一个逻辑小时开始。 我的代码如下所示: 我只需要在聚合5分钟后写,而不是每次更新。有可能吗?阅读这里表明,不使用低级API,可能是不行的,我正试图避免使用低级API,因为这似乎是一个足够简单的任务,可以用更高级的API来完成。

  • 在本指南中,我们将从头开始建立属于自己的项目,使用 Kafka Streams 编写一个流处理应用程序。如果你还没阅读过 quickstart (在Kafka流中运行一个流应用程序)章节,我们强烈建议你先去阅读一下。 建立一个Maven项目 使用以下命令来创建具有 Kafka Streams 项目架构的 Maven 原型: mvn archetype:generate \ -Darchety

  • 问题内容: 我有以下状态: 然后我更新状态: 由于setState是假设要合并的,所以我希望它是: 但是它吃掉了id,状态为: 这是预期的行为吗?仅更新嵌套状态对象的一个​​属性的解决方案是什么? 问题答案: 我认为不做递归合并。 您可以使用当前状态的值构造一个新状态,然后调用该状态: 我在这里使用过函数function(来自underscore.js库),通过创建状态的浅表副本来防止对该状态的现

  • 有不同类型的自动化驱动程序 我正在使用appium和Selenium自动化iOS本机应用程序。 我应该从以下列表中使用哪个驱动程序: WebDriver RemoteWebDriver IOSDriver 阿皮乌姆河 我将使用PageObject模式来实现这一点。 如果有人有iOS本机应用程序(Appium Selenium)的PageObject模式示例项目。 请帮忙。

  • React-Native的核心思想就是组件化,相当于MVC的view,因此开发应用的最佳方式就是将功能组件化。 一、最简单的方式 这里我们实现一个最简单的组件,就是邮件的末尾署名的组件。组件意味着复用,意味着统一。现在有这样一个需求,我们需要根据不同用户发送邮件时,生成每个用户的名片(即邮件末尾的署名)。 1、一般一开始的实现方式如下,直接将组件内容写到功能需求的地方: <View> <V

  • 一步一步从无到有写一个 servlet 容器。一开始不会涉及复杂的部分,中间会进行多次重构,直到完成复杂的功能。