Python Selenium动态“id”和“名称”选择器

时间:2017-05-24 03:54:45

标签: python selenium xpath selenium-webdriver

我必须选择具有动态“id”和“name”选择器的元素,每次重新加载页面时都会更改。我不能使用css选择器,因为我定位的元素共享共同的选择器。以下是我想要选择的两个元素的html:

<td colspan="60" width="60%" class="cell-right" valign="top">
  <textarea onkeydown="event.cancelBubble=true;" onkeypress="event.cancelBubble=true;" onkeyup="event.cancelBubble=true;" name="1c2b0730969c468aa06b312d96f1513b" id="1c2b0730969c468aa06b312d96f1513b" class="auto-size-field" rows="5"></textarea>
</td>

<td colspan="60" width="60%" class="cell-right" valign="top">
  <textarea onkeydown="event.cancelBubble=true;" onkeypress="event.cancelBubble=true;" onkeyup="event.cancelBubble=true;" name="6c5c8088fb474f2b93e1de9fb1b1771d" id="6c5c8088fb474f2b93e1de9fb1b1771d" class="auto-size-field" rows="5"></textarea>
</td>

每次重新加载页面时,“id”和“name”选择器都会动态更改。每次重新加载时xpath也会发生变化,因为包含对'id'标签的引用(例如'// * [@ id =“6c5c8088fb474f2b93e1de9fb1b1771d”]')。正如您所看到的,这两个元素共享相同的css选择器,这使问题更加复杂......

此时的问题是如何单独选择它们以便我可以使用send_keys()与每个文本区域进行交互?

2 个答案:

答案 0 :(得分:1)

这是一个时间问题,在使用find_element时添加implicit wait以等待元素存在。您需要在driver初始化后定义一次,它将适用于driver“生命周期”的其余部分

此外,您要查找的搜索栏的ID和名称为q

from selenium import webdriver

driver = webdriver.Chrome("C:/Users/xxx/xxx/chromedriver/chromedriver.exe")
driver.implicitly_wait(5) # seconds

login_url = "http://www.alluc.ee"
driver.get(login_url)

search_bar = driver.find_element_by_id('q')
# or search_bar = driver.find_element_by_name('q')

答案 1 :(得分:0)

如果您要求在<td>下选择特定的textarea然后使用索引,因为所有事情看起来很常见

<td colspan="60" width="60%" class="cell-right" valign="top">
  <textarea onkeydown="event.cancelBubble=true;" onkeypress="event.cancelBubble=true;" onkeyup="event.cancelBubble=true;" name="6c5c8088fb474f2b93e1de9fb1b1771d" id="6c5c8088fb474f2b93e1de9fb1b1771d" class="auto-size-field" rows="5"></textarea>
</td>
<td colspan="60" width="60%" class="cell-right" valign="top">
  <textarea onkeydown="event.cancelBubble=true;" onkeypress="event.cancelBubble=true;" onkeyup="event.cancelBubble=true;" name="6c5c8088fb474f2b93e1de9fb1b1771d" id="6c5c8088fb474f2b93e1de9fb1b1771d" class="auto-size-field" rows="5"></textarea>
</td>
<td colspan="60" width="60%" class="cell-right" valign="top">
  <textarea onkeydown="event.cancelBubble=true;" onkeypress="event.cancelBubble=true;" onkeyup="event.cancelBubble=true;" name="6c5c8088fb474f2b93e1de9fb1b1771d" id="6c5c8088fb474f2b93e1de9fb1b1771d" class="auto-size-field" rows="5"></textarea>
</td>

假设您要在2nd textarea下输入一些文本,然后使用xpath:

//td[2]/textarea[@class='auto-size-field']

另一种方法是根据唯一的父元素

找到元素

e.g。

//div[@id='divid']/table/tr/td[2]/textarea[@class='auto-size-field']