Java 使用CSS:Selenium通过选取列表的内容查找WebElement

Java 使用CSS:Selenium通过选取列表的内容查找WebElement,java,css,selenium,combobox,Java,Css,Selenium,Combobox,简言之: 我正在用JAVA为没有nice id的web应用程序编写selenium测试(即,它们是动态生成的) 我的情况涉及两个组合框,或者选择列表(如果您愿意),id看起来像这样(注意:实际上,我可能在一个页面上有数百个组合框,而不仅仅是两个。两个是保持简单:): 使用CSS选择器,我可以通过以下方式在列表中获取这些元素: "...findElements(By.cssSelector("select[id*='WORKRECORD']"); 其中*的工作方式类似于“CONTAINS”语句

简言之:

我正在用JAVA为没有nice id的web应用程序编写selenium测试(即,它们是动态生成的)

我的情况涉及两个组合框,或者选择列表(如果您愿意),id看起来像这样(注意:实际上,我可能在一个页面上有数百个组合框,而不仅仅是两个。两个是保持简单:):

使用CSS选择器,我可以通过以下方式在列表中获取这些元素:

"...findElements(By.cssSelector("select[id*='WORKRECORD']");
其中*的工作方式类似于“CONTAINS”语句

问题是我不知道哪个元素是哪个元素,因为我不能利用整个id。我所知道的是我有一个选择列表,但我不能轻松地选择我想要或需要的一个。这是因为id中唯一一致的部分是“WORKRECORD”,其他所有内容都是动态的

为了知道我的测试使用了哪个元素,我必须迭代选择列表中的每个项目(选项),并根据其中的内容做出决定。比如说:

    //Get all picklists that contain string "WORKRECORD" in their id. 
    List<WebElement> picklists = 
        driver.findElements(By.cssSelector("select[id*='WORKRECORD']"));

        //iterate through these picklists and get lists of options
    for(WebElement picklist : picklists)
    {
        //get all items/options in the picklist
        List<WebElement> options = picklist.findElements(By.tagName("option"));

        //Next go through each value and see if it is the one I want.  
        //If so, then I found my web element
        for(WebElement option : options)
        {
            if(option.equals(myValue))
            {
                myWantedWebElement = picklist;
                return myWantedWebElement;
            }
        }
    }
//获取id中包含字符串“WORKRECORD”的所有选取列表。
列表选取列表=
driver.findElements(由.cssSelector(“选择[id*='WORKRECORD']”)创建);
//遍历这些选择列表并获取选项列表
对于(WebElement选取列表:选取列表)
{
//获取拾取列表中的所有项目/选项
列表选项=picklist.findElements(按.tagName(“选项”));
//接下来检查每个值,看看它是否是我想要的值。
//如果是,那么我找到了我的web元素
用于(WebElement选项:选项)
{
如果(选项等于(myValue))
{
myWantedWebElement=选取列表;
返回myWantedWebElement;
}
}
}
所以我的问题是:

我可以使用CSS根据选项中的值来定位webElement吗?例如,psuedo代码如下:

List<WebElement> picklists = 
    driver.findElements(By.cssSelector("select[id*='WORKRECORD']:option[value contains 'myValue(s)']"));
List picklists=
driver.findElements(By.cssSelector(“选择[id*='WORKRECORD']:选项[value包含'myValue')));
还是说我必须接受我正在做的事情?还是有更好的东西会让我大吃一惊,等等


谢谢大家,干杯

另一种方法是使用XPath选择器-按
选项定位
值,然后选择其父级
选择

myWantedWebElement = driver.findElement(By.xpath("//select[contains(@id,'WORKRECORD')]/option[.='optionvalue']/.."));
以下CSS选择器将找到所需的
选项
,但不会为您提供
选择
,因为CSS选择器没有父选择器-您无法遍历备份DOM树

select[id*='WORKRECORD'] > option:contains('optionvalue')

我同意费兹的观点。以下
xpath
也可以使用:

xpath = //select[contains(@id,'WORKRECORD') and ./option[contains(.,'optiontext')]] 

上面的xpath将定位选择标记,其中其id包含
工作记录
,其子项包含
optiontext
,作为其可见文本

。此链接提供了一种更好的方法:@Richard-对于这种特定情况,使用
选择
类将非常缓慢。更好的要使用的xpath可以是
//select[contains(@id,'WORKRECORD')和option[.='optionvalue']]
像一个符咒一样工作。谢谢Faiz。
xpath = //select[contains(@id,'WORKRECORD') and ./option[contains(.,'optiontext')]]