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



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

有什么想法吗?

您可以将部分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"));

id属性的值对我来说是动态的,因此作为替代方案,您可以使用以下 css 选择器:

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(),因此您可能需要诱导WebDriverWaitElementToBeClickable(),并且您可以使用以下任一定位器策略:

  • 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();
    

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

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

建议的方法是使用父元素找到要单击的元素。

或。。 如果grid-xxx--xxx--id 关键字是常量,您可以执行以下操作

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

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

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

最新更新