需要有关动态CSS选择器的帮助

时间:2018-08-08 11:25:08

标签: java eclipse selenium css-selectors

需要有关动态CSS选择器的帮助。

我为所需的Web元素提供了以下CSS选择器:

#sub-cat-822 > div:nth-child(1) > div:nth-child(1) > form:nth-child(1) > div:nth-child(3) > div:nth-child(1) > div:nth-child(2) > input:nth-child(2)

我需要传递仅包含 cat-822 的动态值的变量(变量名称为: Added_Main_category_id1 )(在CSS选择器内) 。请问有人可以在上面的CSS选择器中建议如何调整变量,以便它可以平稳运行?

所需网络元素的外部html:

<input required="required" id="edited_name" name="sub_cate" value="" placeholder="" class="form-control" type="text">

所需网络元素的css路径:

html body.nav-md.pace-done.modal-open div.container.body div.main_container div.right_col div.right_col_container div.right_col_wrapper div.x_panel div.x_content div.post-box ul.cat_accordion.list-group li#854.list-group-item.category-list-item-854 div.cat-name div#sub-cat-854.modal.fade.in div.modal-dialog div.modal-content form div.modal-body.clearfix div.edit-photo-poup div.col-xs-8.col-sm-6 input#edited_name.form-control

所需网页元素的css选择器:

  #sub-cat-822 > div:nth-child(1) > div:nth-child(1) > form:nth-child(1) > div:nth-child(3) > div:nth-child(1) > div:nth-child(2) > input:nth-child(2)

所需网络元素的xpath:

//*[@id="edited_name"]

4 个答案:

答案 0 :(得分:0)

如果id“ edited_name”在HTML源代码中是唯一的,只需使用#edited_name作为CSS选择器

答案 1 :(得分:0)

您可以将选择器字符串视为常规字符串。您可以将任何所需的变量等插入其中。

您说以下内容有效

Invoke_Test_Instance.driver.findElement(By.cssSelector("#sub-cat-831 > div:nth-child(1) > div:nth-child(1) > form:nth-child(1) > div:nth-child(3) > div:nth-child(1) > div:nth-child(2) > input:nth-child(2)")).sendKeys("input value");

您可以使用类似变量的变量

String id = "#sub-cat-831";
Invoke_Test_Instance.driver.findElement(By.cssSelector(id + " > div:nth-child(1) > div:nth-child(1) > form:nth-child(1) > div:nth-child(3) > div:nth-child(1) > div:nth-child(2) > input:nth-child(2)")).sendKeys("input value");

,然后将id变量更改为所需的任何字符串。

这就是说...拥有这么多级别的CSS选择器或任何定位器可能会非常脆弱。 DOM的任何级别的任何更改都将由于级别的数量以及您正在使用的索引而破坏该定位器。

答案 2 :(得分:0)

以下逻辑成功运行。感谢Jeffc分享了这个想法。

字符串category_id =已添加Main_category_id1; //包含#cat-906动态值的变量

字符串truncated_category_id;

truncated_category_id = category_id.substring(category_id.lastIndexOf(“#”)+ 1); //删除#并获取其余的动态值(即cat-906)

字符串id =“ #sub-” + truncated_category_id;

Thread.sleep(3000);

Invoke_Test_Instance.driver.findElement(By.cssSelector(id +“> div:nth-​​child(1)> div:nth-​​child(1)> form:nth-​​child(1)> div:nth-​​child( 3)> div:nth-​​child(1)> div:nth-​​child(2)>输入:nth-​​child(2)“)))。sendKeys(”字段输入值“); //将动态变量和其他静态值作为cssselector传递

答案 3 :(得分:-1)

是否真的需要使用CSS选择器而不是Xpath?通常,Xpath在动态情况下会有所帮助。参见下面的代码

String searchText = "text in the webtable";
driver.get("http://some.site.having.webtable/");
WebElement e = driver.findElement(By.xpath("//td[text()='" + searchText + "']"));

然后可以根据需要自定义xpath。

请发布您的HTML,以使其更容易。