【Selenium】页面特性与js操作页面元素

把安全帽戴好,不让你在爱情路上跌倒...


1.web页面的两个主要对象:document与window

Document 对象
  • 每个载入浏览器的 HTML 文档都会成为 Document 对象。
  • Document 对象使我们可以从脚本中对 HTML 页面中的所有元素进行访问。
提示:Document 对象是 Window 对象的一部分,可通过 window.document 属性对其进行访问。
Document 对象描述
  • HTMLDocument 接口对 DOM Document 接口进行了扩展,定义 HTML 专用的属性和方法。
  • 很多属性和方法都是 HTMLCollection 对象(实际上是可以用数组或名称索引的只读数组),其中保存了对锚、表单、链接以及其他可脚本元素的引用。
  • 这些集合属性都源自于 0 级 DOM。它们已经被 Document.getElementsByTagName() 所取代,但是仍然常常使用,因为他们很方便。
  • write() 方法值得注意,在文档载入和解析的时候,它允许一个脚本向文档中插入动态生成的内容。
注意,在 1 级 DOM 中,HTMLDocument 定义了一个名为 getElementById() 的非常有用的方法。在 2 级 DOM 中,该方法已经被转移到了 Document 接口,它现在由 HTMLDocument 继承而不是由它定义了。

Window 对象

  • Window 对象表示浏览器中打开的窗口。
  • 如果文档包含框架(frame 或 iframe 标签),浏览器会为 HTML 文档创建一个 window 对象,并为每个框架创建一个额外的 window 对象。
  • 注释:没有应用于 window 对象的公开标准,不过所有浏览器都支持该对象。
Window 对象描述
  • Window 对象表示一个浏览器窗口或一个框架。在客户端 JavaScript 中,Window 对象是全局对象,所有的表达式都在当前的环境中计算。也就是说,要引用当前窗口根本不需要特殊的语法,可以把那个窗口的属性作为全局变量来使用。例如,可以只写document,而不必写 window.document。
  • 同样,可以把当前窗口对象的方法当作函数来使用,如只写 alert(),而不必写 Window.alert()。
  • 除了上面列出的属性和方法,Window 对象还实现了核心 JavaScript 所定义的所有全局属性和方法。
  • Window 对象的 window 属性和 self 属性引用的都是它自己。当你想明确地引用当前窗口,而不仅仅是隐式地引用它时,可以使用这两个属性。除了这两个属性之外,parent 属性、top 属性以及 frame[] 数组都引用了与当前 Window 对象相关的其他 Window 对象。

2.示例

描述:如图中所示,正常情况下当我们输入用户名、密码后,直接点击登录按钮即可登录。当我们使用selenium进行web自动化操作时,对两个输入框进行send_keys后,去获取登录按钮元素进行点击,可以看出似乎只有find_element_by_xpath最靠谱了,但是xpath的路径(/html/body/form/table/tbody/tr[3]/td/table/tbody/tr[3]/td/table/tbody/tr[1]/td[5]/img)我是够够的,那么对于这种通过js时间响应的按钮元素,可以通过js去处理。

不重要的解释(可以略过)

onload 事件(W3c上给出的解释):
定义和用法
        onload 事件会在页面或图像加载完成后立即发生。
语法
        onload="SomeJavaScriptCode"
支持该事件的 HTML 标签:
支持该事件的 JavaScript 对象:image, layer, window

对于JQuery的 ready()(W3c的解释):
定义和用法
        当 DOM(文档对象模型) 已经加载,并且页面(包括图像)已经完全呈现时,会发生 ready 事件。
        由于事件在文档就绪后发生,因此把所有其他 jQuery 事件和函数置于该事件中是非常好的做法。正如上面的例子中那样。
        ready() 函数规定当 ready 事件发生时执行的代码。
        ready() 函数仅能用于当前文档,因此无需选择器。
允许使用以下三种语法:
语法 1:$(document).ready(function)
语法 2:$().ready(function)

语法 3:$(function)

实践

登录按钮有个onclick的时间,那么自动化的时候,我们可以使用selenium的driver.execute_script()方法来触发这个事件。

driver.execute_script("window.clickLogin()")
注意:为什么用window,而不用document?这是个疑问。看上面document和window的解释就知道了。





猜你喜欢

转载自blog.csdn.net/u013948858/article/details/80347444