1、如何判断一个页面上元素是否存在?
判断元素存在方法有3种:(存在返回True,不存在返回False)
方法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、如何提高脚本的稳定性
类似问题还有:
如果一个元素今天能定位到,过几天就定位不到了,只要这个页面没变过,说明定位方法是没问题的。
优化方向:
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呢?
原文:https://www.cnblogs.com/String-song/p/14304230.html