怎么判断元素定位到了,这个问题很好判断,给元素加高亮显示:
self.driver.execute_script(
"arguments[0].setAttribute('style', arguments[1]);",
element,
"border: 2px solid red;" #边框border:2px; red红色
)
arguments[0] 这个参数,可以理解为python中的字符串格式化。
————————————————
版权声明:本文为CSDN博主「迷失在人间的小羊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/mdtkzc/article/details/116459909
Python可迭代对象和迭代器 - Ambitious~ - 博客园
专业话:实现了__iter__方法的对象就是可迭代对象
实现了__iter__方法的对象就叫做可迭代对象,__iter__方法的作用就是返回一个迭代器对象。 直观理解就是能用for循环进行迭代的对象就是可迭代对象。
python-生成器_爱吃水饺的小京的博客-CSDN博客_python生成器
生成器函数:使用常规的def语句编写,但是使用yield语句一次返回一个结果,在每次结果产生之间挂起和恢复他们的状态
生成器表达式:类似列表推导,但是返回一个按需产生结果的一个对象,而不是创建一个结果列表
生成器函数定义
def functionname(参数):
TODO
yield 返回值
TODO
生成器函数使用yield返回一个值,yield语句会挂起该函数并向调用者传回一个值,但同时也保留了足够的状态使函数能从它离开的地方继续,当继续时,函数在上一个yield传回后立即继续执行
def gensquares(N):
for i in range(N):
yield i**2
x=gensquares(3)
print(type(x))
print(dir(x))
运行结果:
<class 'generator'>
['__class__', '__del__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__name__', '__ne__', '__new__', '__next__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'close', 'gi_code', 'gi_frame', 'gi_running', 'gi_yieldfrom', 'send', 'throw']
1
2
3
可以看出函数是一个generator,并且内置方法有__iter__和__next__,所以可以用迭代工具,以及next函数
协程
又称微线程。协程是python个中另外一种实现多任务的方式,只不过比线程更小占用更小执行单元(理解为需要的资源)。 为啥说它是一个执行单元,因为它自带CPU上下文。这样只要在合适的时机, 我们可以把一个协程 切换到另一个协程。 只要这个过程中保存或恢复 CPU上下文那么程序还是可以运行的。
通俗的理解:在一个线程中的某个函数,可以在任何地方保存当前函数的一些临时变量等信息,然后切换到另外一个函数中执行,注意不是通过调用函数的方式做到的,并且切换的次数以及什么时候再切换到原来的函数都由开发者自己确定
协程和线程差异
在实现多任务时, 线程切换从系统层面远不止保存和恢复 CPU上下文这么简单。 操作系统为了程序运行的高效性每个线程都有自己缓存Cache等等数据,操作系统还会帮你做这些数据的恢复操作。 所以线程的切换非常耗性能。但是协程的切换只是单纯的操作CPU的上下文,所以一秒钟切换个上百万次系统都抗的住。
协程 - yield
简单实现协程
import time
def work1():
while True:
print("---work1---")
yield
time.sleep(0.5)
def work2():
while True:
print("---work2---")
yield
time.sleep(0.5)
def main():
w1 = work1()
w2 = work2()
while True:
next(w1)
next(w2)
if __name__ == '__main__':
main()
协程 - greenlet
为了更好使用协程来完成多任务,python中的greenlet模块对其封装,从而使得切换任务变的更加简单
使用 pin install greenlet 命令安装greenlet模块
import time
from greenlet import greenlet
def test1():
while True:
print("---A---")
gr2.switch() # 切换到gr2中运行
time.sleep(0.5)
def test2():
while True:
print("---B---")
gr1.switch()
time.sleep(0.5)
gr1 = greenlet(test1)
gr2 = greenlet(test2)
gr1.switch()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
运行结果:

协程 - gevent