selenium 是否按多个类名查找div元素?

n9vozmp4  于 2022-11-24  发布在  其他
关注(0)|答案(4)|浏览(139)

<div class="value test" />我想识别那个web元素。它只定义了这两个类。我不能做下面的事情,因为className不接受空格分隔的值。有什么替代方法吗?

@FindBy(className = "value test")
@CacheLookup
private WebElement test;
slwdgvem

slwdgvem1#

我不认为巴拉马诺斯的回答已经完全说明了这一点。
假设我们有如下几个元素:

  1. <div class="value test"></div>
  2. <div class="value test "></div>
  3. <div class="first value test last"></div>
  4. <div class="test value"></div>
    XPath如何匹配
  • 只匹配1(完全匹配),巴拉的回答
driver.findElement(By.xpath("//div[@class='value test']"));
  • 匹配1、2和3(匹配类包含value test,类顺序要紧)
driver.findElement(By.xpath("//div[contains(@class, 'value test')]"));
  • 匹配1、2、3和4(只要元素具有valuetest类)
driver.findElement(By.xpath("//div[contains(@class, 'value') and contains(@class, 'test')]"));

而且,在这种情况下,Css选择器总是支持XPath(快速、简洁、原生)。

  • 匹配1
driver.findElement(By.cssSelector("div[class='value test']"));
  • 匹配1、2和3
driver.findElement(By.cssSelector("div[class*='value test']"));
  • 匹配1、2、3和4
driver.findElement(By.cssSelector("div.value.test"));
ovfsdjhp

ovfsdjhp2#

试试看:

test = driver.findElement(By.xpath("//div[@class='value test']"));
2eafrhcq

2eafrhcq3#

分类依据.按类名

Class By.ByClassName在www.example.com中的定义By.java如下:

/**
 * Find elements based on the value of the "class" attribute. If an element has multiple classes, then
 * this will match against each of them. For example, if the value is "one two onone", then the
 * class names "one" and "two" will match.
 *
 * @param className The value of the "class" attribute to search for.
 * @return A By which locates elements by the value of the "class" attribute.
 */
public static By className(String className) {
  return new ByClassName(className);
}

此用例

因此,根据定义,您不能将多个类(即valuetest)作为参数传递给@FindBy(className = "...")。发送多个类将引发如下错误:

invalid selector: Compound class names not permitted

溶液

有多种方法可以解决此用例,如下所示:

  • 如果元素仅通过classname**value**唯一标识,则可以用途:
@FindBy(className = "value")
@CacheLookup
private WebElement test;
  • 如果元素仅通过classname**test**唯一标识,则可以用途:
@FindBy(className = "test")
@CacheLookup
private WebElement test;
  • 如果classnames、**valuetest**都是标识元素所必需的,则可以按如下所示使用css-selectors
@FindBy(css  = ".value.test")
@CacheLookup
private WebElement test;
  • 您也可以使用xpath,如下所示:
@FindBy(xpath   = "//*[@class='value test']")
@CacheLookup
private WebElement test;

tl; dr

无效的选择器:使用Selenium时出现不允许使用复合类名的错误

btxsgosb

btxsgosb4#

如果还有人想知道的话,我通过用点连接类名来完成这个任务:
巨蟒:

time_element = post.find_elements(By.CLASS_NAME, 'MUxGbd.wuQ4Ob.WZ8Tjf')[0].text

相关问题