我正在试着写我自己的期望条件。我需要的是。。。我有一个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"))
它下面的行工作正常...我不明白。
根据文件:
默认情况下,WebDriverWait每500毫秒调用一次ExpectedCondition,直到它成功返回。对于所有其他ExpectedCondition类型,成功返回的值为布尔返回true或非null。
如果您注释掉自定义等待,那么多次获得相同的URL这一事实应该会给您一个提示。
在\uuu call\uuu()
中,您总是返回False
,因为URL从未更改。由于您返回的是False
,因此预期的条件永远不会满足,您会得到TimeoutException
。
因此,要么重新定义预期条件逻辑,要么针对不同的情况进行测试。
使用@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>`
本主题似乎遗漏了自定义预期条件的示例。
这实际上很容易。首先,什么是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 容器。一开始不会涉及复杂的部分,中间会进行多次重构,直到完成复杂的功能。