【问题标题】:How does selenium 2 (webdriver) implement WebElementselenium 2(webdriver)如何实现WebElement
【发布时间】:2011-04-30 13:44:24
【问题描述】:

我正在考虑的场景是基本的:

page = driver.open_page(URL)
linkElement = page.find_elements(XPATH)[0]
linkElement.click()

(我假设我正在使用远程机器 - 即远程驱动程序)。服务器如何知道点击哪个元素。

更一般地说,我找不到 selenium 2 实现的概述。也就是说,一方面只是讲述故事,但不会在代码中逐行执行,但比 api 更详细。

【问题讨论】:

    标签: python selenium selenium-webdriver webdriver implementation


    【解决方案1】:

    您是对的,对于 WebDriver 如何实现其 API 的各个部分,并没有一个万能的“幕后花絮”,主要是因为实际实现可能会因具体情况而大不相同在浏览器和操作系统上。最接近您的是project wiki 上的各个页面。

    为了回答您的具体问题,远程服务器会创建客户端驱动程序的本地实例,并使用它来定位和单击元素。驱动程序(InternetExplorerDriver、FirefoxDriver、ChromeDriver 等)通常使用 JavaScript 来查找元素并获取其在页面上的尺寸和位置。如果需要,元素会滚动到视图中,并且操作系统级别的鼠标事件会发送到浏览器窗口以模拟单击。

    但是,这只是常见的情况,也有例外,例如,某些浏览器可能会使用 JavaScript automation atoms 以外的方式找到元素。同样,某些操作系统上的某些驱动程序依赖于合成事件,而不是操作系统级别或所谓的“本机”事件。要记住的重要一点是,如果您在本地调用驱动程序,远程服务器会实例化相同的对象,而不使用 Selenium 远程服务器。

    【讨论】:

    • 谢谢!您能否谈谈客户端的 webElements 是如何与服务器元素同步的。例如,假设我愿意:elem = page.get_elements(..)[0]elem2 = elem.get_elements(..)。服务器如何“知道”我有elem2(它怎么知道我指向那个元素?)?我猜我在客户端执行的每个操作都会向服务器执行请求 - 是否存在不执行请求的情况?
    • 使用 RemoteWebDriver 执行的每个命令都会使用WebDriver JSON Wire Protocol 调用远程服务器。在这个协议中编码的是 WebDriver 分配给它找到的每个元素的内部 ID。客户端没有缓存。
    • @JimEvans:你能告诉我 FirefoxWebdriver 是如何计算内部 id 的吗?
    • 它不是以任何你可以为 FirefoxDriver 复制的方式“计算”的;这是一个 GUID。
    【解决方案2】:

    如果我理解你的问题是正确的:

    您启动远程 Web 驱动程序服务器。通过远程驱动程序客户端(即您的测试),该服务器被告知获取页面('URL' 是先前设置的变量,例如:String URL = "http://www.asdf.com";)。

    然后服务器被告知通过某个 XPath 查找获取的页面上的所有元素('XPATH' 类似于 By.xpath("//div(@class = 'some_button_class')") - 这是 WebDriver 的 java 实现,我不确定它是如何在 Ruby 中使用的)。此命令将返回 WebElements 列表 - 所有看起来像 <div class="some_button_class"><div> 的“div”元素。如果您不熟悉,请查看how XPath works

    由于您在命令末尾使用[0],因此您是在告诉服务器返回该列表中的第一个元素(第一个看起来像<div class="some_button_class"><div> 的div)

    最后,您是在告诉服务器对该元素执行一次点击。服务器获取该命令,将其转换为 javascript 并将该 javascript 注入页面。注入的 javascript 会触发页面上的“点击”事件,并执行如果真实用户点击该元素会发生的情况。

    希望这会有所帮助。

    【讨论】:

    • 不,我不是这个意思。假设你这样做:linkElem = page.find_elements(XPATH) 然后childLink = linkElem.find_elements(XPATH_2)。最后,点击childLink。现在,服务器如何知道点击哪里?
    • 嗯.. 与第一个 web 元素的方式相同。它获取 DOM 的一个元素,然后是另一个 DOM 元素,它是第一个元素的子元素。然后它点击它(使用 javascript 来执行点击)。我不确定确切的机制,但我猜一些 HTTP 客户端正在获取页面,HTML 解析器正在解析它,而 XPath 解析器正在扫描 HTML 页面以查找您要求的 DOM 元素。最后HTTP客户端正在注入Javascript并执行点击......
    猜你喜欢
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 1970-01-01
    相关资源
    最近更新 更多