通常大家定位不到元素,遇到有以下几种情况:
1、页面还没有加载完成,元素还没加载出来,可以用sleep(XX) , implicitly_wait(xx) ,WebDriverWait + until() / until_not()方法
2、元素为隐藏元素,在页面不可见,可用js方法,
# 返回了这个元素的值用return,如果没有,return,就只是用execute_script执行这一句话,没有返回值
js = 'return document.getElementById("orderHeaderId").value;'
self.orderHeader = currentDr.execute_script(js)
3、我们在定位一个页面元素的时候反复检查自己写的定位器没有任何问题,就是一直定位不了,这时就要看这个页面元素是否在一个iframe中,下面将iframe相关的点总结了一下
(1) #iframe可使用id或者name直接定位 index是序号的意思,第一个为0
currentDr.switch_to_frame("framename & id & index");
#用webElement对象来定位
WebElement frame=driver.find_element_by_tag_name("iframe")
currentDr.switch_to_frame(frame);
#iframe没有id或者name,使用xpath定位
WebElement frame=driver.findElement(By.xpath( "/html/body/div[2]/div[8]/div[2]/div[3]/div/div[2]/div/iframe" )); currentDr.switch_to_frame(frame);
(2) #进入一个iframe后返回到html根目录
currentDr.switch_to.default_content()、
需要注意的是:iframe1 和 iframe2 如果是平级关系,现在是在iframe1中,如果想进入iframe2 得先回到跟目录,自
己验证的结果是这样,如果不先回到跟目录,进入下一个iframe会报错
(3)#进入一个iframe后退到上一个表单
currentDr.switch_to.parent_frame()
主要是用于下列场景,想进入iframe2,得先从主iframe 进入 iframe1 然后再进入iframe2 ,之后又想进入iframe1就可
以用这个倒退的方法
(1) from selenium.webdriver.support import expected_conditions as EC
WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it(By.NAME("frame_name")));
// By.ID By.CSS_SELECTOR By.XPATH