方法1:用try…except…
def is_element_exsist1(driver, locator):
"""
:param driver: webdriver
:param locator: tuple
:return: bool
"""
try:
driver.find_element(*locator)
return True
except Exception as msg:
print("元素 %s 找不到:%s" %(locator, msg))
return False
if __name__ == '__main__':
driver = webdriver.Chrome()
loc1 = ("id", "bibi")
print(is_element_exsist1(driver,loc1))
方法2:用elements定义一组元素方法
def is_element_exsist2(driver, locator):
"""
:param driver: webdriver
:param locator: tuple
:return: bool
"""
eles = driver.find_elements(*locator)
if len(eles) < 1:
return False
else:
return True
if __name__ == '__main__':
driver = webdriver.Chrome()
# loc1 = ("id", "bibi")
# print(is_element_exsist1(driver,loc1))
loc2 = ("id", "bibi")
print(is_element_exsist2(driver, loc2))
方法3:结合WebDriverWait和excepted_conditions判断 (强烈推荐!!!)
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
def is_element_exsist3(driver, locator):
"""
:param driver: webdriver
:param locator: tuple
:return: bool
"""
try:
WebDriverWait(driver, 30, 1).until(EC.presence_of_element_located(locator))
return True
except :
return False
if __name__ == '__main__':
driver = webdriver.Chrome()
# loc1 = ("id", "bibi")
# print(is_element_exsist1(driver,loc1))
# loc2 = ("id", "bibi")
# print(is_element_exsist2(driver, loc2))
loc3 = ("id", "bibi")
print(is_element_exsist3(driver, loc3))
2、如何提高脚本的稳定性
类似问题还有:
用例在运行过程中经常会出现不稳定的情况,也就是说这次可以通过,下次就没办法通过了,如何去提升用例的稳定性?
如何提高selenium脚本的执行速度?
selenium中如何保证操作元素的成功率?也就是说不管网络加载慢还是快
如果一个元素今天能定位到,过几天就定位不到了,只要这个页面没变过,说明定位方法是没问题的。
优化方向:
不要右键复制xpath,自己写相对路径,多用id为节点查找
定位没问题,第二个影响因素就是等待时间了。sleep等待尽量少用(影响执行时间)。driver.implicity_wait(10)隐式等待也不要用,不要以为是全局的就是好事。有些JS加载失败时候会一直等,并且页面跳转时也无法识别。
定位元素方法重新封装,结合WebDriverWait和excepted_conditions判断元素方法,自己封装一套定位元素方法
复制代码
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
def find_ele(driver, locator, timeout=30):
ele = WebDriverWait(driver, timeout, 1).until(EC.presence_of_element_located(locator))
return ele
复制代码
3、如何定位动态元素
动态元素有2种情况,一个是属性动态,比如id是动态的,定位时那就不要用id定位。还有一种情况动态的,那就是这个元素一会在页面上方,一会在下方,飘忽不定的动态元素,定位方法一样按F12,根据元素属性定位(元素的tag、name的步伐属性是不会变的,动的只是class属性和styles属性)。
4、如何通过子元素定位父元素
selenium里通过父元素定位子元素,可以通过二次定位来找到该元素。
ele=driver.find_element_by_id("parent").find_element_by_id("child")
5、子元素定位父元素
可以通过xpath的语法直接定位:.//*[@name="hell"]/.. 两个点就是代表父级元素了。
6、一个元素明明定位到了,点击无效(也没报错),如何解决?
使用js点击,selenium有时点击元素是会失效的
# js点击
js = 'document.getElementById("baidu").click()'
driver.execute_script(js)
7、隐藏元素
元素的属性隐藏和显示,主要是 type="hidden"和style="display:none;"属性来控制的
定位 type="hidden"隐藏元素
ele=driver.find_element_by_id("p")
print("打印元素信息:%s" %ele)
获取元素属性
print(ele.get_attribute("name"))
判断元素是否隐藏
print(ele.is_displayed())
隐藏元素用普通定位方法,事实上是定位到了。
8、操作隐藏元素
隐藏元素可以正常定位到,只是不能操作。操作元素是click,clear,send_keys这些方法。
隐藏输入框元素输入文本:隐藏元素用send_keys()方法会抛异常 ElementNotVisibleException。这个报错是说元素不可见,不可以被操作。
JS操作隐藏元素
selenium是无法操作隐藏元素的(但是能正常定位到),本身这个框架就是设计如此。如果非要去操作隐藏元素,那就用js的方法去操作,selenium提供了一个入口可以执行js脚本。
js和selenium不同,只要页面上有的元素(在dom里面的)都能正常的操作。
js点击hidden元素
js = 'document.getElementById("baidu").click()'
driver.execute_script(js)
运行完之后,会发现页面正常点击了
备注:百度搜到的可能方法是先用js去掉hidden属性,再用selenium操作,这样有点多此一举了。既然都已经会用js了,何必不一次性到位直接click呢?