首页 > 解决方案 > 如何区分包含相同文本的元素 Python Selenium

问题描述

我正在尝试获取用户输入以浏览网站。我试图根据用户输入来识别网页中的元素,但是有时用户输入的字符串会匹配多个元素,因此我会点击错误的元素。

search = input("Enter something to search for")
elem = browser.find_elements_by_xpath(f'//span[text()="{search}"]')

是否有任何提示可以识别动态环境中的元素?我在想也许我可以通过两个标准来识别元素——比如它与文本匹配(如上所述),但也可以通过其他两个元素没有的属性来识别?

由于它是动态的,因此我可以基于搜索的设置属性并不多(我不会预先知道类名或 id)。我唯一能想到在字符串匹配之上添加的是外部类的文本,因为这在我将进行的所有搜索中都是一致的,但我不确定这是否可能?

任何在动态环境中识别元素的技巧都值得赞赏。

具有完全相同文本的三个元素的 xpath 是:

/html/body/div[3]/div/div/div[1]/div/div/div/div/div/div/div/div[2]/div/div[1]/li/button/span/ul/li/span[2]/span
/html/body/div[3]/div/div/div[1]/div/div/div/div/div/div/div/div[2]/div/div[2]/li[1]/a/span/ul/li[1]/span/span
/html/body/div[3]/div/div/div[1]/div/div/div/div/div/div/div/div[2]/div/div[2]/li[2]/a/span/ul/li[1]/span[1]/span

其中一个元素的示例(它们都看起来像这样):

<span class="ccl-19882374e640f487 ccl-1daa0367dee37c3b">TEXT</span>

还有一个 h4 “title” 标签,位于一些匹配元素的上方:

<h4 class="ccl-2a4b5924e2237093 ccl-21bead492ce4ada2 ccl-706ed5a06ead17d8 ccl-2b95b58eee016846">Categories</h4>

下面的问题截图。当您搜索“伦敦”的酒店时,您会在Locations标题下获得多个元素的列表,在Properties标题下获得多个元素。我想单击出现在属性标题下的第一个元素。这只是一个示例,它会根据用户搜索的位置而有所不同,因此可能并不总是返回已知数量的位置/属性 - 可能永远不会返回任何位置!

在此处输入图像描述

谢谢

标签: pythonseleniumselenium-webdriver

解决方案


也许简单地添加 if 语句会有所帮助:

search = input("Enter something to search for")
elem = browser.find_elements_by_xpath(f'//span[text()="{search}"]')
if len(elem) > 1:
     elem[0].click() # select the element you want to click from the list

如果列表中的元素将包含一些额外的属性,您可以通过这种方式过滤它们:

search = input("Enter something to search for")
elem = browser.find_elements_by_xpath(f'//span[text()="{search}"]')
if len(elem) > 1:
     elem.find_element_by_css_selector('type_of_selector[class="some_class"]')

您能否提供有关这些元素的更多详细信息,我们将考虑解决方案。问候!


推荐阅读