1.产生场景,执行下述语句,click之后,页面发生变化,原页面被覆盖重新打开新页面,导致元素定位不到。
报错1:stale element reference: element is not attached to the page document
报错2:NoSuchFrameException: Message: no such frame
报错2:查找不到元素
driver.find_element_by_xpath('//*[@id="create_business"]').click()
2.排查思路:肯定是由于页面发生变化导致的元素定位不到,所以需要打开查找元素的页面。
方法1.执行完click后,重新绑定页面,失败。
currentWin = driver.current_window_handle
handles = driver.window_handles
print(handles)
for i in handles:
if currentWin == i:
continue
else:
#将driver与新的页面绑定起来
driver = driver.switch_to.window(i)
方法2.执行完click后,重新绑定页面,成功。
driver.switch_to.frame("right")
原因:selenium做自动化的过程中,经常会遇到alert、frame和新的window,本次跳转实际上是frame进行了跳转,因此需要用到switch_to.frame
扩展:
同一个windows页面下,不同的frame
1.
driver = webdriver.Firefox()
driver.switch_to.frame(0) # 1.用frame的index来定位,第一个是0
# driver.switch_to.frame("frame1") # 2.用id来定位
# driver.switch_to.frame("myframe") # 3.用name来定位
# driver.switch_to.frame(driver.find_element_by_tag_name("iframe")) # 4.用WebElement对象来定位
2.并列的iframe,可以使用switch_to.frame(0)、switch_to.frame(1)表示;嵌套的iframe需要通过id、name来切换。
3.从子iframe切到父iframe使用driver.switch_to.parent_frame()
4.从frame中切回主文档使用switch_to.default_content()
不同的window下
1.switch_to.window
switch_to.window(driver.window_handles[0])表示第一个window窗口
switch_to.window(driver.window_handles[1])表示第二个window窗口
弹窗alert/confirm/prompt
1.switch_to.alert.accept()