javascript - Selenium Python : Cannot find element after javascript runs

标签 javascript python selenium sap-gui

我正在尝试使用 Python 自动化一些 SAP 作业监控。我想创建一个应该执行以下操作的脚本:

连接并登录 SAP 环境 -> 打开 SM37 事务 -> 发送作业参数(名称-用户-发件人)->> 读取输出并将其存储到数据库中。

我不知道有任何模块或库允许我这样做。所以我检查了 WEBGUI 是否已启用。我可以通过浏览器打开环境。浏览模块应该允许我做我需要的一切。 尝试使用 Mechanize 和 RoboBrowser。它可以工作,但 WEBGUI 运行大量 javascript 进行渲染,而这些模块不处理 javascript。

还有一个镜头:Selenium。 我能够连接并登录到该环境。但是当尝试从新页面(主菜单)选择一个元素时,Selenium 无法找到该元素。

打印源代码我意识到主菜单站点是用 javascript 呈现的。源代码根本不包含该元素,仅包含标题(“Welcome”)。则表示登录成功。

我读了很多要求这个的帖子,每个人都建议在一些明确的条件下使用 WebDriverWait

试过了,没用:

driver.get("http://mysapserver.domain:8000/sap/bc/gui/sap/its/webgui?sap-client=300&sap-language=ES")
wait = WebDriverWait(driver, 30)
element = wait.until(EC.presence_of_element_located((By.ID, 'ToolbarOkCode')))

编辑:

有两个源代码:SC-1 是 Selenium 读取的源代码。 SC-2 是 JavaScript 渲染站点后出现的一个(来自“Inspect Element”的那个)。

完整的 SC-1 是这样的: https://pastebin.com/5xURA0Dc

元素本身的 SC-2 如下:

<input id="ToolbarOkCode" ct="I" lsdata="{0:'ToolbarOkCode',1:'Comando',4:200,13:'150px',23:true}" lsevents="{Change:[{ClientAction:'none'},{type:'TOOLBARINPUTFIELD'}],Enter:[{ClientAction:'submit',PrepareScript:'return\x20its.XControlSubmit\x28\x29\x3b',ResponseData:'delta',TransportMethod:'partial'},{Submit:'X',type:'TOOLBARINPUTFIELD'}]}" type="text" maxlength="200" tabindex="0" ti="0" title="Comando" class="urEdf2TxtRadius urEdf2TxtEnbl urEdfVAlign" value="" autocomplete="on" autocorrect="off" name="ToolbarOkCode" style="width:150px;">

仍然无法找到该元素。我该如何解决? 提前致谢。

最佳答案

解决方案是进入包含渲染的 html(带有控件)的 iframe。

driver2.get("http://mysapserver.domain:8000/sap/bc/gui/sap/its/webgui?sap-client=300&sap-language=ES")
iframe = driver2.find_elements_by_tag_name('iframe')[0]
driver2.switch_to_default_content()
driver2.switch_to_frame(iframe)
driver2.find_element_by_id("ToolbarOkCode").send_keys("SM37")
driver2.find_element_by_id("ToolbarOkCode").send_keys(Keys.ENTER)

关于javascript - Selenium Python : Cannot find element after javascript runs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45415587/

相关文章:

javascript - PhantomJS 中的动画主体滚动顶部不会更改滚动顶部值

javascript - 子文件夹中图像的工作箱路由

javascript - 如何使用 Angularjs 显示 Json?

python - Spyder IDE 控制台历史

python - 如何在 Windows 7 64 位上使用 theano 设置 cuDnn

java - 如何在 selenium 中运行代码以在 python 脚本而不是 cron 中的一天中的特定时间执行函数

javascript - 使用 PropType 对嵌套对象属性进行类型检查

python - 使用带有多个参数的 fromfile_prefix_chars (nargs ="*")

javascript - 如何通过 Python 使用 Selenium 将日期作为文本直接发送到具有只读属性的日历控件?

java - org.openqa.selenium.WebDriverException : Timed out waiting for driver server to start while initiating Chrome browser through Selenium