使用Selenium VBA在Chrome中切换回父窗口的技术问题
解决Selenium VBA中关闭多子窗口后无法返回父窗口的问题
这个问题的核心在于Selenium VBA里的switchToPreviousWindow是基于窗口切换历史栈工作的,而不是直接返回父窗口。当你关闭第二个子窗口后切回第一个,再关闭第一个子窗口,此时调用switchToPreviousWindow会试图回到已经关闭的第二个子窗口(因为它在切换栈的上一位),而不是最初的父窗口。
最可靠的解决办法是在打开任何子窗口之前,先记录父窗口的句柄,之后不管子窗口怎么切换关闭,直接通过句柄切回父窗口即可。
修改后的代码示例
我调整了你的代码,添加了父窗口句柄的记录和直接切换逻辑:
For a = 9 To LastRow If Wb.Sheets(DestName).Cells(a, 3).Text = "Report Name" Then 'Checking if cell has 'Report Name' StoreFile = Wb.Sheets(DestName).Cells(a, 4).Text Debug.Print StoreFile ' 【新增:保存父窗口句柄】 Dim parentHandle As String parentHandle = driver.WindowHandle 'Click on Report Set myelement = driver.FindElementByLinkText(StoreFile) 'Click on report by name Debug.Print myelement.Text If myelement Is Nothing Then GoTo endTry ElseIf StoreFile = "CBD_Yoplait" Then StoreFile = "CBD_Yoplait" & ".Category Buyer Dynamic" Debug.Print StoreFile Set myelement = driver.FindElementByLinkText(StoreFile) myelement.Click Else myelement.Click End If '1st child window opens driver.SwitchToNextWindow Application.Wait (Now + TimeValue("0:0:07")) 'Click on 'Report Home' Set myelement = driver.FindElementByXPath("//*[@id=""ribbonToolbarTabsListContainer""]/div[1]/table/tbody/tr/td[3]") If myelement Is Nothing Then MsgBox ("no element found") Else myelement.Click End If 'Click on 'Export' Set myelement = driver.FindElementByXPath("//*[@id=""RptHomeMenu_""]/tbody/tr/td/div/div[16]/a/div[2]") If myelement Is Nothing Then MsgBox ("no element found") Else myelement.Click End If 'Click on 'Excel with Formatting' Set myelement = driver.FindElementByXPath("//*[@id=""RptHomeExportMenu_WEB-INFxmllayoutsblocksHomeExportMenuLayoutxml""]/tbody/tr/td/div/div[8]/a/div[2]") If myelement Is Nothing Then MsgBox ("no element found") Else myelement.Click End If 'Opend 2nd child window driver.SwitchToNextWindow Application.Wait (Now + TimeValue("0:0:05")) 'Click on 'Export filter details' Set myelement = driver.FindElementById("exportFilterDetails") If myelement Is Nothing Then MsgBox ("no element found") Else myelement.Click End If 'Click on Export button Set myelement = driver.FindElementById("3131") If myelement Is Nothing Then MsgBox ("no element found") Else myelement.Click End If Application.Wait (Now + TimeValue("0:0:08")) FileSpec = StoreFile & ".xls*" Debug.Print FileSpec FileName = Dir(MyDir & FileSpec) Debug.Print FileName If FileName <> "" Then MostRecentFile = FileName MostRecentDate = FileDateTime(MyDir & FileName) Do While FileName <> "" If FileDateTime(MyDir & FileName) > MostRecentDate Then MostRecentFile = FileName MostRecentDate = FileDateTime(MyDir & FileName) End If FileName = Dir Loop End If MyFile = MostRecentFile Debug.Print MyFile ChDir MyDir Set SrcWb = Workbooks.Open(MyDir + MyFile, UpdateLinks:=0) 'Saving as xls workbook SrcWb.SaveAs DestFolder & MyFile, XlFileFormat.xlExcel8 Application.Wait (Now + TimeValue("0:0:04")) Application.DisplayAlerts = True SrcWb.Close ' 关闭第二个子窗口,切回第一个子窗口 driver.Close driver.SwitchToPreviousWindow ' 关闭第一个子窗口,直接切回父窗口(不再依赖switchToPreviousWindow) driver.Close driver.SwitchToWindow parentHandle ' 【关键修改:用父窗口句柄直接切换】 Application.Wait (Now + TimeValue("0:0:08")) endTry: End If Next a
为什么这个方法有效?
driver.WindowHandle会返回当前(父)窗口的唯一标识符,只要父窗口没有被关闭,这个句柄就一直有效driver.SwitchToWindow可以直接通过句柄定位到目标窗口,完全绕过切换历史栈的限制,避免了因窗口关闭导致的切换错误
内容的提问来源于stack exchange,提问作者shettyrish
相关产品推荐
相关产品推荐

