【问题标题】:How to find a lot of elements that contains a certain text with Selenium (Python)如何使用 Selenium (Python) 查找大量包含特定文本的元素
【发布时间】:2021-06-21 15:34:14
【问题描述】:

我想检查浏览器是否能够查找包含不同单词的许多不同元素的存在。 在这种情况下,我有时会使用此代码:

try:

    elemtwo = WebDriverWait(browser, 2, poll_frequency=0.1, ignored_exceptions=None).until(
        EC.element_to_be_clickable((By.XPATH, "//*[contains(text(), ' first example of text')]")))
    if elemtwo:
        break

except NoSuchElementException and TimeoutException:
    pass
try:
    elem = WebDriverWait(browser, 2, poll_frequency=0.1, ignored_exceptions=None).until(
        EC.element_to_be_clickable((By.XPATH, "//*[contains(text(), 'second example of text')]")))
    if elem:
        break

except NoSuchElementException and TimeoutException:
    pass   

如果我有 20 个不同的单词,我应该怎么做才能通过尽可能少的书写找到它们? 让我更好地解释一下:例如,我有一个这样的 20 个单词的列表:

  • 警察;
  • 苹果;
  • 猴子;
  • ecc...

同一个命令{browser.find_element_by_xpath("//*[contains(text(), "one of the list's word")]")}不写20次怎么办?

FIRST EDIT:对不起,我没有说明以上20个字或文字是我随意选择的,无论它们与网站的相关性如何。

【问题讨论】:

  • 我们可以用 Java 做到这一点,但不能用 Python
  • @Prophet:对不起!你说我们不能在 python 中做到这一点是什么意思?
  • 在我看来,Prophet意味着在python上我必须写: browser.find_element_by_xpath("//*[contains(text(), "police")]") browser.find_element_by_xpath("/ /*[contains(text(), "apple")]") browser.find_element_by_xpath("//*[contains(text(), "monkey")]") ecc....并对每个单词重复该命令我正在寻找,
  • 为什么不将它们存储在所有警察、苹果的列表中,然后使用循环并一一提供给 find_element
  • cruisepandey,我也有类似的想法,但我无法具体化。

标签: python selenium automation


【解决方案1】:

您可以执行 find_elements_by_xpath 而不是 find_element_by_xpath 然后迭代。

编辑 - 这是我编写的用于遍历页面上的链接列表的代码。

从硒导入网络驱动程序

chromePath = "chromedriver.exe"

driver = webdriver.Chrome(chromePath)

url = "http://books.toscrape.com/"

driver.get(url)

elems = driver.find_elements_by_xpath("//a[@href]")

对于元素中的元素:

print(elem.get_attribute("href"))

【讨论】:

    【解决方案2】:

    Selenium 中有两种方法

    find_elementfind_elements

    find_element : - 查找元素将返回单个 web 元素,其中 as

    find_elements : - 将返回一个网络元素列表。

    所以不要写这个

    browser.find_element_by_xpath("//*[contains(text(), "a list's word")]")
    

    n 次然后,

    你可以这样做

    browser.find_elements_by_xpath("//*[contains(text(), "a list's word")]")
    

    注意: xpath //*[contains(text(), "a list's word")] 应该代表 UI 中的多个 web 元素,否则如果碰巧你将最终得到单个 web 元素。

    现在我看到您正在使用显式等待,所以在这种情况下,

    您有很多选择,例如:

    presence_of_all_elements_located
    

    visibility_of
    

    它们都会返回一个网络元素列表,所以当你这样做时:

    list_of_ele = wait.until(EC.presence_of_all_elements_located((By.XPATH, 'some xpath')))
    

    现在迭代它,或者做 Python 允许你用这个列表做的任何事情。

    在这里阅读更多:

    Selenium - official docs

    更新 1:

    list = ['apple', 'police', 'etc', 'something else']
    counter = 0
    for search in list:
        driver.find_element_by_xpath("//html/body/"+ list[counter])
        counter = counter  +1
    

    【讨论】:

    • 我无法理解如何使用您的答案来解决我的问题。也许,如果我具体告诉你我想做什么,你可能会更好地理解我打算做什么。简而言之,我正在为亚马逊创建一个黄牛机器人,当它发现以下短语时必须崩溃: Disponibilité inconnue "," Bientôt disponible "" 目前不可用 "," 不可用 "," 可用以来 "," 不可用 " , "Temporalmente sin stock"
    • 为此,我使用 {browser.find_element_by_xpath("//*[contains(text(), "a list's word")]")}。就我而言,列表词包括我在上一条评论中写给您的短语。
    • @Michael : 如果我得到你,请看上面更新的 1
    • 这可能是我正在寻找的解决方案,因为如我所见,您的代码试图通过整个页面找到元素的列表
    • 尽管有这个问题,但你的直觉帮助我更好地写出了这个问题。
    猜你喜欢
    • 1970-01-01
    • 2020-09-05
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-24
    • 2016-12-10
    相关资源
    最近更新 更多