【问题标题】:Python Selenium Dynamic "id" and "name" SelectorPython Selenium 动态“id”和“name”选择器
【发布时间】:2019-02-24 21:54:42
【问题描述】:

我必须选择具有动态“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() 与每个文本区域进行交互?

【问题讨论】:

  • 你可以为搜索栏添加 HTML 吗?为什么不能使用任何 css 定位器?

标签: python selenium xpath selenium-webdriver


【解决方案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')

【讨论】:

  • 嗨,谢谢您的意见,但这并不是我真正想要的。请参阅我必须使用“绝对”xpaths 而不是 id 选择器。原因是我试图让它在“id”是动态的页面上工作(每次重新加载页面时都会改变)
  • @LawlessLeopard 在这种情况下,您应该提供具体示例。使用绝对的xpath 通常是个坏主意,除了id 之外,还有很多其他方法可以定位元素。
  • 根据您的建议,我只是将问题更改为包含一个具体示例。我尝试使用绝对 xpath 的原因是,我想要选择的元素共享相同的 css 选择器,并且具有动态的“id”和“name”标签,这些标签在每次重新加载页面时都会发生变化。关于如何选择这些有什么建议吗?
  • @LawlessLeopard 有可能通过祖先(虽然不是一直到&lt;html&gt; 标签)、兄弟姐妹甚至孩子来定位它们。如果您发布指向该页面的链接,我可以看看。
【解决方案2】:

如果您需要在 &lt;td&gt; 下选择特定的文本区域,请使用索引,因为所有的东西似乎都很常见

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

假设您想在第二个文本区域下输入一些文本,然后在 xpath 下使用:

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

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

例如

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 2015-02-04
    • 1970-01-01
    • 2020-11-25
    相关资源
    最近更新 更多