Python编写SAP GUI脚本时关闭弹窗的问题求助
解决SAP GUI脚本弹窗关闭失效问题
先梳理你代码里的几个关键问题,修正后就能正常关闭弹窗:
问题1:变量名不统一
你最后判断弹窗的代码用了session.ActiveWindow.Name,但前面所有操作都是self.session,变量名不一致会导致判断失效甚至报错,要统一用self.session。
问题2:setFocus方法未执行
所有setFocus都是方法调用,必须加(),比如self.session.findById("wnd[0]/usr/ctxtEINE-WERKS").setFocus(),不加括号的话这个方法根本没运行,焦点没正确设置,可能导致后续操作触发的弹窗不符合预期。
问题3:弹窗存在性判断不可靠
直接判断ActiveWindow的名称不一定准确,SAP GUI里可以用exists属性检查弹窗是否存在,这种方式更稳妥。另外,弹窗出现可能有延迟,加短暂等待能避免漏判。
修改后的代码
import time for index, row in data.iterrows(): self.session.findById("wnd[0]/usr/ctxtEINA-LIFNR").text = row.SAP_Local_Vendor_ID self.session.findById("wnd[0]/usr/ctxtEINA-MATNR").text = row.Part_No self.session.findById("wnd[0]/usr/ctxtEINE-EKORG").text = "1000" self.session.findById("wnd[0]/usr/ctxtEINE-WERKS").text = "0695" # 补全setFocus的括号,执行焦点设置 self.session.findById("wnd[0]/usr/ctxtEINE-WERKS").setFocus() self.session.findById("wnd[0]/usr/ctxtEINE-WERKS").caretPosition = 4 self.session.findById("wnd[0]/tbar[0]/btn[0]").press() self.session.findById("wnd[0]/tbar[1]/btn[8]").press() self.session.findById("wnd[1]/tbar[0]/btn[7]").press() self.session.findById("wnd[0]/usr/ctxtRV13A-DATAB").text = "12/01/2022" self.session.findById("wnd[0]/usr/tblSAPMV13ATCTRL_D0201/txtKONP-KBETR[2,0]").text = row.Unit_by_PER self.session.findById("wnd[0]/usr/tblSAPMV13ATCTRL_D0201/txtKONP-KPEIN[4,0]").text = "1000" # 补全setFocus的括号,执行焦点设置 self.session.findById("wnd[0]/usr/tblSAPMV13ATCTRL_D0201/txtKONP-KPEIN[4,0]").setFocus() self.session.findById("wnd[0]/usr/tblSAPMV13ATCTRL_D0201/txtKONP-KPEIN[4,0]").caretPosition = 5 self.session.findById("wnd[0]/tbar[0]/btn[11]").press() # 等待1秒确保弹窗加载完成,可根据实际情况调整时长 time.sleep(1) # 检查弹窗wnd[1]是否存在,第二个参数False表示不存在时不报错 if self.session.findById("wnd[1]", False).exists: self.session.findById("wnd[1]/tbar[0]/btn[5]").press()
额外说明
findById第二个参数传False,是为了避免元素不存在时抛出异常,而是返回一个exists为False的对象,让判断更安全。time.sleep(1)的时长可以根据实际弹窗出现的速度调整,确保弹窗完全加载后再执行关闭操作。
内容的提问来源于stack exchange,提问作者Marcelo Estrada
相关产品推荐
相关产品推荐

