selenium中元素定位正確但是操作失敗的原因無外乎以下4種:

一、頁面沒加載好解決方法:添加等待方法,如:time.sleep()

二、頁面提交需要等待給數據后臺解決方法:添加等待方法,如:time.sleep()

三、瀏覽器沒有以最大化方式打開,導致元素被隱藏,定位不到解決方法:將網頁最大化:driver.maximize_window()如果屏幕比例固定,分辨率有限,通過網頁最大化也沒辦法解決的話,可以通過執行JS方法來實現。

browser.execute_script('window.scrollBy(200,0)')  #此處(200,0)為網頁偏移坐標,200為橫坐標,0為縱坐標
#window.scrollBy()為JS方法# 

四、網頁中存在多個frame框架,所定位的元素不在當前frame中。所以盡管元素明明看起來是定位正確的,但是點擊無效。frame框架作用:frame對象代表一個HTML框架,frame就是一個子窗口,在里面可以加載網頁,內部子窗口進行刷新的時候,不會影響外部窗口。

對于嵌套多個frame的頁面,操作時需要層層跳轉,跳到元素所在的frame。

frame標簽有frameset、frame、iframe三種,frameset與其他普通標簽一樣,不會影響元素的定位;而frame與iframe的切換方法是一樣的。

frame 下是個獨立的HTML文件:

解決方法:可以利用selenium中的switch_to.frame()方法來實現frame之間的跳轉。

具體操作如下:

1.如何對frame進行切換?利用switch_to.frame()方法來進行切換。

1 switch_to.frame(reference)

 

reference是傳入的參數,用來定位frame,可以是id,name,tag name等。假設有下面HTML代碼:

12345678 <html lang="en"><head> <title>FrameTest</title></head><body><iframe src="myframe.html" id="frame1" name="myframe"></iframe></body></html>

則想要切換到上述iframe的方法有:

12345 driver.switch_to.frame(0) #用frame的index定位,第一個是0driver.switch_to.frame("frame1") #用frame的id來定位driver.switch_to.frame("myframe") #用name來定位driver.switch_to.frame(driver.find_element_by_tag_name("iframe")) #用iframe對應的tag name來定位driver.switch_to_frame(driver.find_element_by_xpath("//iframe[contains(@src,'myframe')]")) #利用xpath來定位

 

2.如何從子frame切換回主文檔?切換到子frame后就無法再對主文檔元素進行操作了,所以要切換回主文檔。方法為:driver.switch_to.default_content()

driver.switch_to.default_content()

 

3.多層frame如何切換?如果有多層frame要逐層進行切換,例如下列多個frame嵌套的HTML代碼:

12345 <html> <iframe id="frame1"> <iframe id="frame2" / > </iframe></html>

 

(1)從主文檔切換到frame 2:

driver.switch_to.frame('frame1')  #先從主文檔切換到frame1
driver.switch_to.frame('frame2')  #再從frame1切換到frame2

(2)從frame2切回到frame1:從frame2再切回frame1,這里selenium給我們提供了一個方法能夠從子frame切回到父frame,而不用我們切回主文檔再切進來。

1 driver.switch_to.parent_frame() # 如果當前已是主文檔,則無效果

有了parent_frame()這個相當于后退的方法,我們可以隨意切換不同的frame,隨意的跳來跳去了。

總結下,遇到frame跳轉問題,利用以下三個方法便可以搞定:

123 driver.switch_to.frame(reference)driver.switch_to.parent_frame()driver.switch_to.default_content()

五、元素屬性為動態屬性,看著定位已經正確,但是隨著鼠標點擊位置不同,元素的屬性發生變化。

例如下面這個頁面的目錄的class屬性就隨著該元素是否被點擊而發生變化:解決方法:換元素的另一個固定屬性來進行定位。

六、頁面元素在頁面打開的時候被其他彈出窗口擋住。解決方法:添加關閉彈出窗口步驟。