Java Selenium:使用x路径单击包含逗号(,)文本的按钮

Java Selenium:使用x路径单击包含逗号(,)文本的按钮,java,selenium-webdriver,xpath,Java,Selenium Webdriver,Xpath,你好, 亲爱的各位, 我正在使用selenium 4.0 JDK1.8 我正在寻找一种方法来单击包含文本“蓝、黑、红”的按钮 这是该按钮的html代码 <button class="product-variation">Blue, Black, Red</button> rs.getString是我的结果集。 所以直接声明将是 driver.findElement(By.xpath("//button[contains(text(), \

你好, 亲爱的各位, 我正在使用selenium 4.0 JDK1.8 我正在寻找一种方法来单击包含文本“蓝、黑、红”的按钮 这是该按钮的html代码

<button class="product-variation">Blue,  Black, Red</button>
rs.getString是我的结果集。 所以直接声明将是

driver.findElement(By.xpath("//button[contains(text(), \"Blue,  Black, Red"\")]")).click();
只有此按钮产生错误。 下面是堆栈跟踪:

org.openqa.selenium.NoSuchElementException: Unable to locate element: //button[contains(text(), "Blue, Black, Red")]
For documentation on this error, please visit: https://selenium.dev/exceptions/#no_such_element
Build info: version: '4.0.0-beta-1', revision: 'Unknown'
System info: host: 'USER-PC', ip: '192.168.1.102', os.name: 'Windows 7', os.arch: 'x86', os.version: '6.1', java.version: '1.8.0_281'
Driver info: org.openqa.selenium.firefox.FirefoxDriver
Command: [cccafdbc-075c-488b-b69f-bd8ffafb4c9c, findElement {using=xpath, value=//button[contains(text(), "Blue, Black, Red")]}]
Capabilities {acceptInsecureCerts: true, browserName: firefox, browserVersion: 86.0.1, javascriptEnabled: true, moz:accessibilityChecks: false, moz:buildID: 20210310152336, moz:debuggerAddress: localhost:60419, moz:geckodriverVersion: 0.29.0, moz:headless: false, moz:processID: 5120, moz:profile: C:\Users\hamzali\AppData\Lo..., moz:shutdownTimeout: 60000, moz:useNonSpecCompliantPointerOrigin: false, moz:webdriverClick: true, pageLoadStrategy: normal, platform: WINDOWS, platformName: WINDOWS, platformVersion: 6.1, rotatable: false, setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unhandledPromptBehavior: dismiss and notify}
Session ID: cccafdbc-075c-488b-b69f-bd8ffafb4c9c
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at org.openqa.selenium.remote.codec.w3c.W3CHttpResponseCodec.createException(W3CHttpResponseCodec.java:195)
    at org.openqa.selenium.remote.codec.w3c.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:128)
    at org.openqa.selenium.remote.codec.w3c.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:52)
    at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:181)
    at org.openqa.selenium.remote.service.DriverCommandExecutor.invokeExecute(DriverCommandExecutor.java:153)
    at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:128)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:620)
    at org.openqa.selenium.remote.RemoteWebDriver$Mechanism$2.findElement(RemoteWebDriver.java:1255)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:388)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:382)
    at shopee.ShopeeProductPriceChecker.test(ShopeeProductPriceChecker.java:225)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:89)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:541)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209)

非常感谢您的帮助。

我测试了您的第二个xpath:

//button[contains(text(), \"Blue,  Black, Red"\")]
然而,它并没有起作用,很可能是因为最后不需要引用。我想你的意思是:

//button[contains(text(), \"Blue,  Black, Red\")]
我通常使用单引号,因为我认为可读性更好,您可以尝试使用:

//button[contains(text(), 'Blue,  Black, Red')]
如果这不起作用,可能您的元素在iframe中,您应该首先切换到它

//button[contains(text(), 'Blue,  Black, Red')]