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