Selenium 2 (WebDriver) 如何实现 WebElement
我考虑的场景很简单:
page = driver.open_page(URL)
linkElement = page.find_elements(XPATH)[0]
linkElement.click()
(我假设我在使用远程机器,也就是远程驱动程序)。那么,服务器是怎么知道要点击哪个元素的呢?
更一般来说,我找不到关于selenium 2实现的概述。也就是说,我想要一些能简单讲述这个过程的内容,而不是逐行分析代码,同时又比单纯的API文档要详细得多。
2 个回答
如果我理解你的问题没错的话:
你启动了一个远程的网页驱动服务器。通过一个远程驱动客户端(也就是你的测试代码),这个服务器会被指示去获取一个网页('URL'是之前设置的一个变量,比如:String URL = "http://www.asdf.com";
)。
然后,服务器会被指示通过某种XPath来找到获取到的网页上的所有元素('XPATH'就像是 By.xpath("//div(@class = 'some_button_class')")
- 这是Java中WebDriver的用法,我不太确定在Ruby中是怎么用的)。这个命令会返回一个WebElements的列表 - 所有看起来像 <div class="some_button_class"><div>
的'div'元素。如果你对XPath不太熟悉,可以看看XPath是怎么工作的。
因为你在命令的最后加了 [0]
,这意味着你告诉服务器返回那个列表中的第一个元素(第一个看起来像 <div class="some_button_class"><div>
的div)。
最后,你告诉服务器对那个元素执行点击操作。服务器接收到这个命令后,会把它转换成JavaScript,并把这个JavaScript注入到网页中。注入的JavaScript会触发网页上的'click'事件,就像一个真实用户点击了那个元素一样。
希望这能帮到你。
你说得对,实际上没有一个通用的方法可以详细说明WebDriver是如何实现其各种功能的,因为具体的实现方式会根据浏览器和操作系统的不同而大相径庭。你能找到的最接近的资料就是项目维基上的各种页面。
针对你具体的问题,远程服务器会创建一个本地的客户端驱动实例,然后用它来找到并点击页面上的元素。这个驱动(比如InternetExplorerDriver、FirefoxDriver、ChromeDriver等)通常会使用JavaScript来查找元素,并获取它在页面上的尺寸和位置。如果需要,元素会被滚动到可视区域,然后会向浏览器窗口发送一个操作系统级别的鼠标事件,以模拟点击。
不过,这只是一般情况,实际上也有例外。例如,有些浏览器可能会用其他方法找到元素,而不是使用JavaScript的自动化原子。同样,有些操作系统上的驱动可能依赖于合成事件,而不是操作系统级别的“原生”事件。重要的是要记住,远程服务器创建的对象和你在本地调用驱动时创建的是一样的,只不过没有使用Selenium的远程服务器。