我正在使用硒使用find_element_by_id
定位和选择HTML元素。直到昨天,Web开发人员将元素的ID更改为动态字符串时,我才对此没有任何疑问。
以下是该ID的示例:input_205
。
之前,我使用browser.find_elements_by_xpath('//*[@id="input_205"]').send_keys(viewId)
来定位元素,并且效果很好,但是现在该字符串中的数字值会动态变化。
我确定的唯一模式是每次页面加载时都是三位数。
我想知道是否有一种方法可以将xpath设置为某种“开头为”或“包含”,以便无论input_
之后的三位数,我仍然可以定位ID。预先谢谢你!
答案 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()
的动态元素,因此您必须使用设置为WebDriverWait的expected_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