使用Celes和python通过CssSelector的“开头为”方法定位元素

时间:2018-07-20 19:32:11

标签: python selenium selenium-webdriver xpath css-selectors

我正在使用硒使用find_element_by_id定位和选择HTML元素。直到昨天,Web开发人员将元素的ID更改为动态字符串时,我才对此没有任何疑问。

以下是该ID的示例:input_205

之前,我使用browser.find_elements_by_xpath('//*[@id="input_205"]').send_keys(viewId)来定位元素,并且效果很好,但是现在该字符串中的数字值会动态变化。

我确定的唯一模式是每次页面加载时都是三位数。

我想知道是否有一种方法可以将xpath设置为某​​种“开头为”或“包含”,以便无论input_之后的三位数,我仍然可以定位ID。预先谢谢你!

2 个答案:

答案 0 :(得分:3)

尝试使用XPath:

Workbooks.OpenText fileName:="C:\somefile.txt", _
    FieldInfo:=Array(Array(1, 2), Array(2, 2), Array(3, 1))

答案 1 :(得分:0)

正如您在问题中提到的,直到昨天您都没有问题,可以通过以下方式找到元素:

browser.find_elements_by_xpath('//*[@id="input_205"]').send_keys(viewId)

那是因为所需的元素已分配了静态id

但是现在元素id是动态的,并且通过某些 JavaScript / AjaxCalls 进行分配。因此,要标识元素,您必须构造一个动态Locator Strategy。但是您的代码试用仅使我们了解了id属性。要构建动态定位器,您可以使用以下提到的项目中的多个项目:

  • <tagName>标签,例如<input>
  • class属性,例如class="input-full"
  • 部分id属性,例如input_中的id="input_205"
  • 角度属性,例如ng-click="navigate('export',$event)"

最重要的是,由于该元素是用于调用send_keys()的动态元素,因此您必须使用设置为WebDriverWaitexpected_conditions方法来诱使element_to_be_clickable(locator)共轭。

例如,如果元素在HTML DOM中的表示方式如下:

<div class="form-group clearfix">
        <input id="input_205" class="input-full" type="text" ng-click="navigate('run',$event)">
</div>

您的有效定位器将是:

  • CSS_SELECTOR

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input.input-full[id^='input_']"))).send_keys(viewId)
    
  • XPATH

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@class='input-full' and starts-with(@id, 'input_')]"))).send_keys(viewId)
    

注释A :与cssSelectors一起使用的通配符的引用:

  • ^ :表示属性值开头
  • * :表示属性值包含
  • $ :表示属性值结尾

注释B :您必须添加以下导入:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC