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

时间:2020-01-09 09:02:27

标签: c# selenium selenium-webdriver css-selectors webdriver

我有一个问题,正在使用的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)

有什么想法吗?

3 个答案:

答案 0 :(得分: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"));

答案 1 :(得分: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 开头,后跟动态值,因此您可以使用 ^ 来表示开始于
  • 后端始终包含 -id-cell- ,因此您可以使用*来表示包含

但是,由于所需元素是动态元素,因此要在元素上调用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();
    

答案 2 :(得分:0)

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

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

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

或.. 如果grid-xxx--xxx-- id关键字是常量,则可以执行类似的操作

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

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

输入更改为实际的Web元素。