在我刚刚学习使用selenium的时候,就会出现NoSuchElementException的错误。
第一种方案是使用Python中time模块的sleep函数,使程序暂停运行。
但是如果需要点击很多次这种方法就需要等很久。
下面是我的解决方案

第一种:
selenium的内置方法:implicitly_wait()
如下:

from selenium import webdriver
driver = webdriver.Chrome()
#设置最大等待时长
driver.implicitly_wait(10)
#寻找元素
driver.find_element_by_id('xxxxx')

如果找不到元素,那么每隔 半秒钟 会再找一次,直到找到该元素或者过了最大等待时长。

这种方法叫做隐式等待
注意:
设置了隐式等待,那么在整个webdriver实例对象的声明周期内,会影响正常的响应。

第二种:
这种方案是我个人的想法,如有错误,希望各位斧正。
这种方法是在代码的开头定义一个函数,让程序在找不到该元素时继续下一轮的寻找。

代码如下:
from selenium import webdriver

#定义函数
#driver是webdriver的一个实例对象
#x是需要寻找的元素的地址
def search_wait(driver,x):
	#设置一个死循环
	while True:
		#try-except命令是Python内置的,作用是在try分支下的代码报错时程序不退出,而是执行except分支的内容。
		try:
			#这里寻找元素的方法随意,我个人比较喜欢xpath,方便。
			#后面的click()可以不加,看具体情况吧,如果点击的次数比较多,加上可能更好?
			driver.find_element_by_xpath(x).click()
			#如果找到元素,退出循环
			break
		except#如果没有找到元素,进入下一次循环,继续寻找
			continue

定义了这样的一个函数之后,我们就可以在寻找某个元素点击它的时候,使用下面的代码:

search_wait(driver,'//*[@id="xxxxx"]')

另外,如果你有输入的需求,你可以在定义的函数中再加入一个参数,来满足点击、输入
例如:

from selenium import webdriver
def search_input(driver,x,condittion,text):
	#condition参数是表明你想搜索、点击或者输入
	#text是想输入的文本
	while True:
		try:
			#仅仅搜索元素
			if condition == 'sousuo':		
				driver.find_element_by_xpath(x)
			#搜索并点击元素
			elif condition == 'sousuo_dianji':	
				driver.find_element_by_xpath(x).click()
			#搜索并输入内容
			else:			
				driver.find_element_by_xpath(x).send_keys(text)
			#成功后退出循环,否则进入下一个循环 
			break
		except:
			continue

实例:

#搜索
search_input(driver,'元素地址','sousuo')
#搜索并点击
search_input(driver,'元素地址','sousuo_dianji')
#搜索并输入
search_input(driver,'元素地址','shuru','这里写你想要输入的内容')

当然,判断的条件可以自己随便设置,比如1、2、3之类的。

以上就是我个人的一点看法。

本文地址:https://blog.csdn.net/swift_taylor/article/details/110478321