如何在 selenium java 中捕获和导航 <a> 和 <span> 标签下的元素

How to capture and navigate element under <a> and <span> tag in selenium java

我想捕获元素并在链接到 <a> 标签和 <span> 标签下的元素的页面上导航。我尝试使用 selenium IDE 但它无法捕获这些元素。因此,我在 java 中编写了代码,并参考了 Whosebug 的许多链接,但我仍然无法解决我的问题。 下面是我的 java 代码:

package com.selenium;

import java.util.ArrayList;
import java.util.concurrent.TimeUnit;

import org.eclipse.jetty.websocket.api.Session;
import org.junit.*;
import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;
import org.openqa.selenium.*;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.Select;
import org.openqa.selenium.firefox.FirefoxDriver;

public class FirstTestSelenium {

    public static void main(String[] args) {
        // declaration and instantiation of objects/variables
        WebDriver driver;

        System.setProperty("webdriver.firefox.marionette", "D:\geckodriver.exe");
        driver = new FirefoxDriver();
        Session session;
        String baseUrl = "";
        String expectedTitle = "QlikView";
        String actualTitle = "";
        // launch Fire fox and direct it to the Base URL
        driver.get(baseUrl);
        actualTitle = driver.getTitle();
        System.out.println(actualTitle);
        if (actualTitle.contentEquals(expectedTitle)) {
            System.out.println("Test Passed!");
        } else {
            System.out.println("Test Failed");
        }
        // driver.findElement(By.xpath("//span[text()='Demand
        // Summary']")).getText();
        // close Fire fox
        driver.findElement(By.xpath("//*[normalize-space()='S/D Summary']"));
        ;

        driver.close();

        // exit the program explicitly
        System.exit(0);
    }

}

下面是我的 UI 代码:

<li style="display: list-item;" order="2" rel="DocumentSH07" id="Document\SH07">
    <a style="color: rgb(0, 0, 0); background: rgb(255, 255, 255) none repeat scroll 0% 0%;" href="javascript:;">
    <span style="font-weight: normal; font-family: Arial; font-size: 9pt; font-style: normal; text-decoration: none;">Demand Summary</span>
    </a>
    </li>

请帮助我解决我的问题,因为我是 selenium 的新手,但我已经尽力了。它给出 NoSuchElementFound 异常。
谢谢!

下面的代码片段应该能够定位元素:

WebElement aTagElement = driver.findElement(By.cssSelector("a[style='color: rgb(0, 0, 0); background: rgb(255, 255, 255) none repeat scroll 0% 0%;']"));
WebElement spanTagElement = driver.findElement(By.cssSelector("span[style='font-weight: normal; font-family: Arial; font-size: 9pt; font-style: normal; text-decoration: none;']"));

详细的 UI 代码可能有助于编写更好更小的定位器。

但是您可以通过使用(对于 aTagElement 并且也可以扩展到 span 标记元素。)来减少选择器长度。

style*='background: rgb(255, 255, 255)' // meaning style contains background color rgb(255, 255, 255)

style^='color: rgb(0, 0, 0)' //meaning style starts with color rgb(0, 0, 0)

style$='0%;' //meaning style ends with 0%.

您的定位器正在寻找 "Demand Summary"

"//*[normalize-space()='Demand Summary']"

但是您提供的 HTML 显示 "S/D Summary"

<span ...>S/D Summary</span>

将定位器更改为 "//*[.='S/D Summary']",它应该可以工作。

使用 //*[normalize-space()='Demand Summary'] 将不起作用,因为这会找到多个元素(整个正文、列表项、a 标签和 span 标签),但是您的 java 代码正在寻找一个单个元素。尝试 //span[normalize-space()='Demand Summary'] 而不是

在您的代码中替换此行

driver.findElement(By.xpath("//*[normalize-space()='S/D Summary']"));

来自

driver.findElement(By.xpath("//li/a/span[text()='Demand Summary']"));

感谢大家宝贵的时间和建议,但我通过以下代码解决了它:

driver.findElement(By.linkText("Demand Summary")).click();