17

動機

SeleniumのCSSセレクターメカニズムをCSS属性セレクターおよびHTML5data-カスタム属性とともに利用して、要素の特定のフックに対処します。

問題

上記を使用してCSSクラス名とdata-属性が割り当てられた要素を見つけると、次の例外がスローされます。

Caused by: org.openqa.selenium.remote.ErrorHandler$UnknownServerException: The given selector .gs-a-btn["data-value"] is either invalid or does not result in a WebElement. The following error occurred:
[Exception... "An invalid or illegal string was specified"  code: "12" nsresult: "0x8053000c (NS_ERROR_DOM_SYNTAX_ERR)"  location: "file:///C:/DOCUME~1/eliranm/LOCALS~1/Temp/anonymous6109849275533680625webdriver-profile/extensions/fxdriver@googlecode.com/components/driver_component.js Line: 5956"]
Build info: version: '2.23.1', revision: '17143', time: '2012-06-08 18:59:28'
System info: os.name: 'Windows XP', os.arch: 'x86', os.version: '5.1', java.version: '1.6.0_31'
Driver info: driver.version: unknown
    at <anonymous class>.<anonymous method>(file:///C:/DOCUME~1/eliranm/LOCALS~1/Temp/anonymous6109849275533680625webdriver-profile/extensions/fxdriver@googlecode.com/components/driver_component.js:6537)

関連コード

public void previous(String type) {
    By cssSelector = By.cssSelector(".gs-a-btn[data-value='" + type + "']");
    driver.findElement(cssSelector).click();
}

私は何を試しましたか

  • 属性セレクタークエリ内で一重引用符をエスケープされた二重引用符に置き換えます。
  • ".gs-a-btn[\"data-value\"]"属性値セレクターの代わりに属性セレクターを指定します。つまり、".gs-a-btn[data-value='" + type + "']"
  • CSS属性セレクターの制限について、 SeleniumReferenceなどの参照で情報を検索します。この文書には、具体的に次のように記載されています。

    現在、 cssセレクターロケーターは、 css3の名前空間:nth-of-type、 一部の疑似クラス(、、、、、、、、、、、) :nth-last-of-type、および疑似要素( 、、、、、)を除くすべてのcss1、css2、およびcss3セレクターをサポートし ています 。:first-of-type:last-of-type:only-of-type:visited:hover:active:focus:indeterminate::first-line::first-letter::selection::before::after

4

2 に答える 2

12

リンクしたリファレンスはSeleniumIDE用です。

Selenium WebDriverのドキュメントは、主にここ(基本的な使用法)ここ(高度な使用法)の公式サイトにありますが、ここ(別名「まだドキュメントに含まれていないもの」-特にFAQ高度なユーザーインタラクションなど)にもあります。 Seleniumの内部に関する情報の)。もちろん、主な情報源はJavaDocsです。


ともかく。SeleniumでサポートされているCSSセレクターは、その下のブラウザーでサポートされているものです(SizzleCSSエンジンを備えたSeleniumRCを除く)。したがって、この例は間違いなく機能するはずです。この簡単なテストページの使用:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8" />
    </head>
    <body>
        <input type="text" id="myInput" class="field" data-test="testytest" />
    </body>
</html>

IE 8(!!)とFirefox13の両方でこれを正常に実行できました。

WebDriver driver = new FirefoxDriver();
driver.get("path to the file");
By cssSelector = By.cssSelector(".field[data-test='testytest']");
        // or By.cssSelector(".field[data-test=testytest]")
        // or By.cssSelector(".field[data-test]")
driver.findElement(cssSelector).sendKeys("Hello");
driver.quit();

だから私はもっと掘った。FF13 Firebugコンソールでこれを実行しようとすると、次のようになります。

document.querySelector(".field[data-test]")
document.querySelector(".field[data-test=testytest]")
document.querySelector(".field[data-test='testytest']")

正しい要素を返します。ただし、これのいずれか:

document.querySelector(".field['data-test']")
document.querySelector(".field[\"data-test\"]")

「無効または不正な文字列が指定されました」というエラー(FirefoxとIEの両方)で失敗します。これは正しいです(したがって、表示されるエラーメッセージは正しく、セレクターは無効です)。

もう一度試して、引用符を削除typeし、変数に引用符や円記号などが含まれていないことを確認してください。構成は間違いなく機能するはずです。そうでない場合は、新しい例外スタックトレースを投稿して、それを引き起こした正確なセレクターを確認できるようにします。

于 2012-07-01T17:29:33.793 に答える
0

私も同じ例外を受け取っていました。

だから私はCssセレクターの代わりにXpathを通して要素を見つけることによってそれを試しました、そして問題は解決されました

以下は問題のあるコードでした

By.CssSelector("Css selector").GetAttribute("value");

うまくいったコード

By.XPath("Xpath of element").GetAttribute("value");
于 2021-03-03T14:57:29.617 に答える