python selenium 等待元素出现_Python Selenium等待加载几个元素

考虑到Mr.E.和Arran的评论,我在CSS选择器上完全遍历了列表。棘手的部分是关于我自己的列表结构和标记(更改类等),以及动态创建所需的选择器并在遍历期间将它们保存在内存中。

我通过搜索任何未加载状态的内容来处理等待几个元素的问题。您也可以使用“:nth child”选择器,如下所示:#in for loop with enumerate for i

selector.append(' > li:nth-child(%i)' % (i + 1)) # identify child

by its order pos

这是我的硬注释代码解决方案,例如:def parse_crippled_shifted_list(driver, frame, selector, level=1, parent_id=0, path=None):

"""

Traversal of html list of special structure (you can't know if element has sub list unless you enter it).

Supports start from remembered list element.

Nested lists have classes "closed" and "last closed" when closed and "open" and "last open" when opened (on

).

Elements themselves have classes "leaf" and "last leaf" in both cases.

Nested lists situate in

element as
  • list. Each
    • appears after clicking
in each .

If you click

driver - WebDriver; frame - frame of the list; selector - selector to current list (

);

level - level of depth, just for console output formatting, parent_id - id of parent category (in DB),

path - remained path in categories (ORM objects) to target category to start with.

"""

# Add current level list elements

# This method selects all but loading. Just what is needed to exclude.

selector.append(' > li > a:not([class=loading])')

# Wait for child list to load

try:

query = WebDriverWait(driver, WAIT_LONG_TIME).until(

EC.presence_of_all_elements_located((By.CSS_SELECTOR, ''.join(selector))))

except TimeoutException:

print "%s timed out" % ''.join(selector)

else:

# List is loaded

del selector[-1] # selector correction: delete last part aimed to get loaded content

selector.append(' > li')

children = driver.find_elements_by_css_selector(''.join(selector)) # fetch list elements

# Walk the whole list

for i, child in enumerate(children):

del selector[-1] # delete non-unique li tag selector

if selector[-1] != ' > ul' and selector[-1] != 'ul.ltr':

del selector[-1]

selector.append(' > li:nth-child(%i)' % (i + 1)) # identify child

by its order pos

selector.append(' > a') # add 'li > a' reference to click

child_link = driver.find_element_by_css_selector(''.join(selector))

# If we parse freely further (no need to start from remembered position)

if not path:

# Open child

try:

double_click(driver, child_link)

except InvalidElementStateException:

print "\n\nERROR\n", InvalidElementStateException.message(), '\n\n'

else:

# Determine its type

del selector[-1] # delete changed and already useless link reference

# If

is category, it would have as child now and class="open"

# Check by class is priority, because

exists for sure.

current_li = driver.find_element_by_css_selector(''.join(selector))

# Category case - BRANCH

if current_li.get_attribute('class') == 'open' or current_li.get_attribute('class') == 'last open':

new_parent_id = process_category_case(child_link, parent_id, level) # add category to DB

selector.append(' > ul') # forward to nested list

# Wait for nested list to load

try:

query = WebDriverWait(driver, WAIT_LONG_TIME).until(

EC.presence_of_all_elements_located((By.CSS_SELECTOR, ''.join(selector))))

except TimeoutException:

print "\t" * level, "%s timed out (%i secs). Failed to load nested list." %\

''.join(selector), WAIT_LONG_TIME

# Parse nested list

else:

parse_crippled_shifted_list(driver, frame, selector, level + 1, new_parent_id)

# Page case - LEAF

elif current_li.get_attribute('class') == 'leaf' or current_li.get_attribute('class') == 'last leaf':

process_page_case(driver, child_link, level)

else:

raise Exception('Damn! Alien class: %s' % current_li.get_attribute('class'))

# If it's required to continue from specified category

else:

# Check if it's required category

if child_link.text == path[0].name:

# Open required category

try:

double_click(driver, child_link)

except InvalidElementStateException:

print "\n\nERROR\n", InvalidElementStateException.msg, '\n\n'

else:

# This element of list must be always category (have nested list)

del selector[-1] # delete changed and already useless link reference

# If

is category, it would have as child now and class="open"

# Check by class is priority, because

exists for sure.

current_li = driver.find_element_by_css_selector(''.join(selector))

# Category case - BRANCH

if current_li.get_attribute('class') == 'open' or current_li.get_attribute('class') == 'last open':

selector.append(' > ul') # forward to nested list

# Wait for nested list to load

try:

query = WebDriverWait(driver, WAIT_LONG_TIME).until(

EC.presence_of_all_elements_located((By.CSS_SELECTOR, ''.join(selector))))

except TimeoutException:

print "\t" * level, "%s timed out (%i secs). Failed to load nested list." %\

''.join(selector), WAIT_LONG_TIME

# Process this nested list

else:

last = path.pop(0)

if len(path) > 0: # If more to parse

print "\t" * level, "Going deeper to: %s" % ''.join(selector)

parse_crippled_shifted_list(driver, frame, selector, level + 1,

parent_id=last.id, path=path)

else: # Current is required

print "\t" * level, "Returning target category: ", ''.join(selector)

path = None

parse_crippled_shifted_list(driver, frame, selector, level + 1, last.id, path=None)

# Page case - LEAF

elif current_li.get_attribute('class') == 'leaf':

pass

else:

print "dummy"

del selector[-2:]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/352157.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络操作系统第242页作业

1.简述电子邮件的工作原理。 答:用户编辑的E mail被转换成一个标准的邮件格式,这个邮件格式中可以包含各种样式的文件,如图像,声音,可执行程序等。邮件的内容以各种编码方式转换成ASCII码的形式,以便在网络…

MATLAB中median函数的用法

1.功能 求矩阵的中间值。 2.格式 ①median(M) 每一列返回一个值,为M该列的从大到小排列的中间值. ②median(M,dim) dim为1,2。其中1表示按每列返回一个值,为该列从大到小排列的中间值,, 2表示按每行返回一个值,为该行从大到小排列的中间值. 注意:如果行或列的个数为…

测试驱动开发 测试前移_测试驱动陷阱,第2部分

测试驱动开发 测试前移单元测试中单元的故事 在本文的上半部分 ,您可能会看到一些不好但很受欢迎的测试示例。 但是我不是一个专业的批评家(也被称为“巨魔”或“仇恨者”),没有任何建设性的话就抱怨。 多年的TDD教给我的不仅仅是…

CentOS6.3 重启后/etc/resolv.conf 被还原解决办法

今天一台服务器上不了网,设置了nameserver,重启后/etc/resolv.conf文件就被自动还原了,最后发现是被Network Manager修改了。 解决方法: 停止Network Manager服务 service NetworkManager stop重启网络服务 /etc/init.d/network r…

react安装_超全面详细一条龙教程!从零搭建React项目全家桶(上篇)

React是近几年来前端项目开发非常火的一个框架,其背景是Facebook团队的技术支持,市场占有率也很高。很多初学者纠结一开始是学react还是vue。个人觉得,有时间的话,最好两个都掌握一下。从学习难度上来说,react要比vue稍…

MATLAB中find函数详解

(转自http://blog.sina.com.cn/emily250886) 功能: 寻找非零元素的索引和值语法:1. ind find(X) 2. ind find(X, k) 3. ind find(X, k, first) 4. ind find(X, k, last) 5. [row,col] find(X, ...) 6. [row,col,v] f…

Oracle Service Bus简介

我们正在为电信提供商设计一个新系统,在该系统中,我们研究了用作企业服务总线的Oracle服务总线(OSB)。 对我来说,第一个优点是它提供了惊人的工具支持。 通过将其捆绑为Oracle SOA套件,Oracle已将其所有企业…

VS2008中源文件与模块生成时的文件不同,仍要让调试器使用它吗

解决办法: 1.在工具-> 选项-> 调试-> 常规 里 把“要求源文件和版本匹配”的勾勾去掉 然后去掉“地址级的调试”的勾勾(这样就不会出现反汇编代码了) 然后重新引用 2.直接把WEB项目下面的Bin文件夹下的BLL全部删除。 3.若出现如下的警告信息 仔…

Linux中的15个‘echo’ 命令实例

作者: tecmint Avishek Kumar 译者: LCTT geekpi | 2014-10-03 12:42 评论: 4 收藏: 5 分享: 5 echo是一种最常用的与广泛使用的内置于Linux的bash和C shell的命令,通常用在脚本语言和批处理文件中来在标准输出或者文件中显示一行文本或…

springboot redis 断线重连_Redis高可用方案实现

redis中为了实现高可用(High Availability,简称HA),采用了如下两个方式:主从复制数据。采用哨兵监控数据节点的运行情况,一旦主节点出现问题由从节点顶上继续进行服务。主从复制redis中主从节点复制数据有全…

罗德里格斯(Rodrigues)旋转向量与矩阵的变换

在做双目立体视觉深度图像生成的时候,遇到旋转向量(1x3)与旋转矩阵(3x3)的概念,得知二者可以通过罗德里格斯相互转化。 1.旋转的表示 处理三维旋转问题时,通常采用旋转矩阵的方式来描述旋转变换…

Mongodb 分片与副本集

测试搭建192.168.3.110mongos 30000,30001,30002config 40000,40001,40002shard1 50001,50002,50003shard2 50004,50005,50006,shard3 50007,50008,50009[rootmysql-slave10 data]# mkdir -p /data/config/1/data[rootmysql-slave10 data]# mkdir -p /data/config/2…

python必读5本书籍_免费下载!5本从Python入手机器学习的必备电子书!(附链接)...

大数据文摘授权转载自数据派THU作者:Richard Gall编译:车前子、丁楠雅今天,机器学习已成为软件工程所有领域中最重要的发展趋势之一。这门技术不再局限于研究者和数据分析者,从网络安全到网络开发机,器学习都至关重要。…

error c4996: 'fopen' This function or variable may be unsafe如何解决

1.问题描述 VS2013OPENCV249,不止一次遇到以下类似错误: error C4996: fopen: This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.d:\open…

JavaParser中AST节点的观察者

我们离JavaParser 3.0的第一个候选发布版本越来越近。 我们添加的最后一项功能是支持观察抽象语法树的所有节点的更改。 当我为此功能编写代码时,我收到了Danny van Bruggen(又名Matozoid)和Cruz Maximilien的宝贵反馈。 因此,我使…

nc命令详解

NetCat,在网络工具中有“瑞士军刀”美誉,其有Windows和Linux的版本。因为它短小精悍(1.84版本也不过25k,旧版本或缩减版甚至更小)、功能实用,被设计为一个简单、可靠的网络工具,可通过TCP或UDP协…

startindex 不能大于字符串长度_「12」学习MySQL第二类函数:字符串函数

前一篇文章总结了下MySQL中常用的数学函数,本文接下来的重点就是认识“字符串函数”。上图这匹漂亮的马儿就是通过各种字符(字母、括号、逗号、竖线等)画出来的。我不由自主地会去想下面几个问题:它到底有多少个字符?--字符串长度它里面的小写…

对数函数的C、MATLAB表示

1、C语言中的对数函数 头文件:#include格式:①double log (double x);log() 函数返回以 e 为底的对数值,即数学中的lnx;如果 x 为负数或 0,则会发生错误并设置 errno 值。错误代码:EDOM:参数x 为…

微信小程序开发——超链接或按钮点击跳转到其他页面失效

1. 超链接导航失效: 小程序规则——wx.navigateTo 和 wx.redirectTo 不允许跳转到 tabbar 页面,只能用 wx.switchTab 跳转到 tabbar 页面转载于:https://www.cnblogs.com/xyyt/p/9252835.html

javaone_JavaOne 2012:Lambda之路

javaone我最热切期待的JavaOne 2012演讲之一是Brian Goetz的“通往Lambda的道路”。 昨晚的技术主题演讲中的Lambda味道仅增加了预期。 这是在希尔顿广场A / B举行的,距离我之前在金门大桥A / B / C参加的演讲仅几步之遥。 我曾预计会打包相对较大的Plaza A / B&…