c# - Selenium 的 GetAttribute 方法的复杂性

标签 c# dom css-selectors selenium-rc xpath

我最近尝试使用 selenium RC 的 获取属性 方法,但立即遇到了挑战。我试图执行一个非常简单的 selenium.GetAttribute("//a/@href")但是代码抛出了一个带有消息“错误:找不到元素属性://a/@href”的SeleniumException。
通过替换 selenium.GetText("//a[@href]")代替 获取属性 调用,我确认一个元素确实存在,因为这个语句正确地返回了链接的文本。

然后我尝试:

  • 指向具有不同协议(protocol)的不同网页(file:///vs http://)——同样的问题。
  • 使用不同的 xpath 定位器指向不同的属性——同样的问题。
  • 使用 DOM 定位器 selenium.GetAttribute("document.getElementsByTagName('a')[0].getAttribute('href')") - 同样的问题;错误消息略有不同(并且错误消息缺少最后一个括号):“错误:元素 document.getElementsByTagName('a')[0].getAttribute('href' not found”。请注意,这个确切的表达式在 Firebug 中可以正常工作控制台。
  • 使用绝对而不是相对 xpath 寻址,使用 selenium.GetText("xpath=/html/body/a[@href]")确认存在然后selenium.GetAttribute("xpath=/html/body/a/@href")获取属性 - 它起作用了!

  • 而手册明确指出亲戚 xpath 定位器不需要明确的定位器类型(即“xpath=”前缀),它对 保持沉默绝对 xpath 定位器;我由此解释,前缀是必需的。但是出于好奇,我回到我的相对表达式并添加了显式前缀--更改 selenium.GetAttribute("//a/@href")selenium.GetAttribute("xpath=//a/@href") - 这也有效!

    最后,我用非常方便的实验查找 Selenium IDE 中的按钮显示它对元素很好,但对属性失败。我可以理解突出显示属性没有意义,因为属性不是可见的页面元素,但为什么不突出显示包含该属性的元素,并将其设置为不同的颜色?也许不是一项微不足道的任务......

    我的问题:

    我将上述实验的结果提炼为这些问题;这就是我在这里发帖的全部目的!这些对我来说似乎都是一个错误,但如果您认为我的用法不正确或有解决方法,请告诉我:
  • 当其他方法(例如 GetText)不需要时,为什么具有 XPath 定位器类型的 GetAttribute 唯一需要显式定位器类型?
  • 为什么 DOM 定位器因“未找到”错误而失败? (手册还明确指出 DOM 定位器不需要显式定位器类型前缀,但我仍然尝试在 DOM 测试中添加“dom=”作为前缀;它仍然失败。)
  • 为什么 Selenium IDE 在尝试突出显示(查找)属性时不会更优雅地失败?同"xpath=//a/@href"定位器,按下“查找”按钮会产生以下丑陋的消息:“[error] locator not found: xpath=//a/@href, error = [Exception...”Could not convert JavaScript argument arg 0 [inIFlasher.scrollElementIntoView]” nsresult : "0x80570009 (NS_ERROR_XPC_BAD_CONVERT_JS)"位置: "JS 框架::chrome://selenium-ide/content/selenium-runner.js::showElement::line 386"data: no]"

  • 还要求您输入以下内容: 我想要的每个测试的模式是 (A) 获取文本 (locator-for-element-with-attribute) 来确认元素的存在,然后 (B) 获取属性 (属性本身的定位器)。在下表中的 6 个插槽中,我成功解决了其中的 3 个,如详细说明,第 4 个似乎是错误。 剩下的两个插槽有解决方案吗?

    键入 GetText 获取属性
    XPath//a[@href] xpath=//a/@href
    CSS css=a[href] ??
    DOM ?? document.getElementsByTagName('a')[0].getAttribute('href')

    (详细信息:Selenium RC 版本 1.0.3,浏览器:Firefox 3.6.13,我的目标代码为 C#)

    最佳答案

    Selenium RC GetAttribute方法返回 元素\属性定位器。这些定位器的一般形式是

    "[locator (id, xpath, css, etc)]@[attribute name]"
    

    例如
    "SaveButton@href"
    

    返回 href 的值id 为 SaveButton 的元素上的属性.也可以使用 Xpath 定位器:
    "xpath=//a[contains(@id, 'SaveButton')]@href"
    

    返回 href 的值id 包含文本的元素的属性 SaveButton .

    要回答您的问题,
  • 1:我真的不知道,这是Selenium设计者的问题。
  • 2:Selenium 命令执行几个不同的“上下文”。在一些命令中,document指被测网页,在其他命令中,document指的是包含 Selenium 框架的页面(我相信是 testRunner.html)。
  • 3:错误消息说它找不到您请求的元素。如果确实存在错误,之后的信息可能对 Selenium 团队有用,但不会真正影响您。信息越多越好,对吧?
  • 关于c# - Selenium 的 GetAttribute 方法的复杂性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5171205/

    相关文章:

    C# 如何更新 BlockingCollection<T> 中的元素?

    javascript - 将 DOM 节点链接到(浏览器内)域对象 : is direct reference OK? 的选项

    CSS3 从嵌套的 <ul> 中的顶级列表中获取最后一个 <li>

    C# 使用多行发送 Outlook 电子邮件

    c# - SQL Azure 的限制不是搬起石头砸自己的脚吗?

    c# - WPF 理解 Selector.IsSynchronizedWithCurrentItem

    javascript - 在 Javascript 中设置 onclick 属性

    javascript - 查找具有特定文本的 DOM 元素并修改它

    jquery - 无法控制按钮样式和悬停样式

    html - 如何在 css 类的类中编写 ID