通过硒查找元素时如何在CssSelector中使用通配符?

问题描述 投票:0回答:3

我有一个问题,我正在使用的CssSelector的GUID每次都会更改,因此测试只能通过一次。我可以在CssSelector中使用通配符来帮助我解决这个问题吗?考虑下面的代码...

IWebElement PersonalPhone = Driver.driver.FindElement(By.CssSelector("# Grid365e0689-dccb-695f-97af-dc29187d4e1d-id-cell-0-7 > a"));
PersonalPhone.Click();

我希望上面的代码使用通配符通过CssSelector定位元素,以便我可以删除选择器的GUID部分,仅根据最后一部分'id-cell-0-7'找到元素,然后单击元素。

我正在使用用C#编写的Selenium WebDriver(Chrome)

有什么想法吗?

c# selenium selenium-webdriver css-selectors webdriver
3个回答
0
投票

您可以将部分id与包含*=一起使用

IWebElement PersonalPhone = Driver.driver.FindElement(By.CssSelector("[id*='id-cell-0-7'] > a"));

或以$=结尾

IWebElement PersonalPhone = Driver.driver.FindElement(By.CssSelector("[id$='id-cell-0-7'] > a"));

0
投票

很抱歉给您这个消息,但是xpath 1.0在大多数驱动程序中仍在使用...相当:

正如其他答案所指出的那样,XPath 1.0不支持常规表达式。

建议的方法是使用父元素来定位您想要单击的元素。

..如果grid-xxx--xxx-- id关键字是常量,则可以执行以下操作:

Xpath://*[starts-with(@id, 'Grid')]/a-ID以网格开头

CSS:input[id^='Grid'] > a-ID以网格开头

input更改为实际的Web元素。


0
投票

id属性的值在我看来是动态的,因此,可以选择使用以下

IWebElement PersonalPhone = Driver.driver.FindElement(By.CssSelector("[id^='Grid'][id*='-id-cell-'] > a"));
PersonalPhone.Click();

优化一行中的代码行:

Driver.driver.FindElement(By.CssSelector("[id^='Grid'][id*='-id-cell-'] > a")).Click();

说明

id属性:

  • 总是以Grid开头,后跟动态值,因此您可以使用^表示starts-with
  • 始终包含-id-cell-在后端,因此您可以使用*表示contains

但是,由于所需元素是动态元素,因此要在元素上调用click(),您可能必须为ElementToBeClickable()引入WebDriverWait,并且可以使用以下Locator Strategies中的任何一个:

  • CssSelector

    new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(By.CssSelector("[id^='Grid'][id*='-id-cell-'] > a"))).Click();
    
  • XPath

    new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(By.XPath("//*[starts-with(@id, 'Grid') and contains(@id, '-id-cell-')]/a"))).Click();
    
© www.soinside.com 2019 - 2024. All rights reserved.