【问题标题】:Need help regarding dynamic CSS selector需要有关动态 CSS 选择器的帮助
【发布时间】:2018-08-13 15:44:45
【问题描述】:

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

我有以下 CSS 选择器用于我想要的 Web 元素:

#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)

我需要传递包含动态值的变量(变量名是:Added_Main_category_id1)仅适用于 cat-822(在上述 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

所需网页元素的cssselector:

  #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"]

【问题讨论】:

  • 发布您的 HTML。
  • 我什么也没看到。推到你的问题吧。
  • Ratmir Asanov 你能分享一下你到底需要什么吗?
  • 用缩进发布你的 HTML 内部问题。
  • 想要的元素有一个ID,你为什么不用它? driver.findElement(By.id("edited_name"));?

标签: java eclipse selenium css-selectors


【解决方案1】:

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

【讨论】:

  • 亲爱的塔兰,感谢您的回复。事实上,当我尝试在 cssselector 中使用#edited_name 运行我的脚本时,我得到:[org.openqa.selenium.ElementNotInteractableException: Element is not visible] 执行后错误,而如果我通过完整的 cssselector 成功执行相同的脚本:即#sub- cat-854 > 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)
  • 唯一的事情是我需要在 cssselector 中传递变量而不是 cat-854,因为我的变量包含动态值。我正在使用 cssselector,因为我在使用 xpath 时遇到了很多不同的异常。
【解决方案2】:

您可以将选择器字符串视为普通字符串。您可以在其中插入任何您想要的变量等。

你说下面的工作

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 任何级别的任何更改都会破坏该定位器。

【讨论】:

  • 亲爱的 Jeffc- 问题出在 #sub-cat-831only cat-831 是动态的,我想使用变量(我想将变量与 #sub- 一起使用,或者您可以说#sub-+我的变量+组合以及剩余的静态 cssselector 部分是必需的),以便我的脚本应该能够与动态 cssselector 一起运行。希望你明白这一点。
【解决方案3】:

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

String category_id = added_Main_category_id1;//包含#cat-906动态值的变量

String truncated_category_id;

truncated_category_id =category_id.substring(category_id.lastIndexOf("#")+1);//去掉#并获取剩余的动态值(即cat-906)

String id = "#sub-"+truncated_category_id;

线程.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) > input:nth-child(2)")).sendKeys("字段输入值"); // 将动态变量和其他静态值作为 cssselector 传递

【讨论】:

    【解决方案4】:

    真的有必要使用 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 以使其更容易。

    【讨论】:

    • SteroidKing666 是的,我真的需要 cssselector .. 因为在我的场景中,我花了很多时间,而且它与静态 cssselector 一起工作得很好,所以我只需要传递一个包含动态值的变量,剩余的 cssselector 总是保留一样
    • 您能否通过编辑将 HTML 发布到您的原始帖子中?或者更好的是,只需向我们提供检查链接即可。
    • 亲爱的 SteroidKing666, 正如您所建议的,我在我的问题中提供了外部 html 和 csspath。期待解决我的问题。谢谢
    • 在创建动态定位器时,XPath 并不比 CSS 选择器更有利。它们的工作原理相同,只是 CSS 选择器更快、支持更广泛、语法更容易学习。
    • @JeffC 谢谢。你能帮我解决我的问题吗?再次感谢
    猜你喜欢
    • 2011-02-27
    • 1970-01-01
    • 2019-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-01
    相关资源
    最近更新 更多