【问题标题】:Selenium Python how to find //span number between two valuesSelenium Python如何找到//两个值之间的跨度数
【发布时间】:2022-01-16 04:15:01
【问题描述】:

HTML 示例:

<div class="lend-count">
<span>50</span>
</div>
<div class="lend-count">
<span>55</span>
</div>
<div class="lend-count">
<span>25</span>
</div>
<div class="lend-count">
<span>45</span>
</div>
<div class="lend-count">
<span>25</span>
</div>
<div class="lend-count">
<span>30</span>
</div>
<div class="lend-count">
<span>25</span>
</div>
<div class="lend-count">
<span>15</span>
</div>
<div class="lend-count">
<span>10</span>
</div>

在 selenium chrome webdriver 中。我试图找到介于数字范围 (10-20) 之间的第一个跨度,在本例中为 15,然后单击它。如果此页面没有任何内容(抛出 NoSuchElementException),请单击下一页按钮并循环返回再试一次:

        while True:
            try:
                driver.find_element(By.XPATH, "//span[number(.)= <10, >20]").click()
                time.sleep (1)
                break
            except NoSuchElementException:
                driver.find_element(By.XPATH, "//*[@class='anticon anticon-right']").click()                     
                time.sleep (1)

也尝试使用范围:

price = range (10,20) 
driver.find_element(By.XPATH, "//span[number(.)= 'price']").click()

请指教

【问题讨论】:

  • 请分享页面 URL 或 HTML 或至少是该特定元素的 HTML
  • 我刚刚添加了 HTML 示例

标签: python selenium selenium-webdriver selenium-chromedriver


【解决方案1】:
driver.find_element(By.XPATH,"//div[@class='lend-count']/span[number()>10 and number()<20]").click()

只需使用 number()>10 和 number()

wait=WebDriverWait(driver, 10)
wait.until(EC.element_to_be_clickable((By.XPATH,"//div[@class='lend-count']/span[number()>10 and number()<20]"))).click()

如果出现具有这些值的跨度,将检查 10 秒,然后抛出异常。

while True:
    try:
        wait.until(EC.element_to_be_clickable((By.XPATH,"//div[@class='lend-count']/span[number()>10 and number()<20]"))).click()
        break
    except NoSuchElementException:
        wait.until(EC.element_to_be_clickable((By.XPATH,"//*[@class='anticon anticon-right']"))).click()            

导入

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC

【讨论】:

  • 网站是否需要定期刷新(driver.refresh()),以便代码找到元素?我不应该使用可见性或存在而不是可点击吗?
  • 这会等待元素弹出 10 秒,然后执行 nosuchelement 异常。刷新页面只会重新加载所有失败的元素,除非每次重新加载后元素都有所不同。
【解决方案2】:

您可以使用 XPath //span[text()] 将所有 Web 元素存储在如下列表中,然后使用循环进行迭代并放置条件 if int(span_text.text) &lt; 10 and int(span_text.text) &gt;20

代码:

while True:
    try:
        list_of_span_tag_text = driver.find_elements(By.XPATH, "//span[text()]")
        for span_text in list_of_span_tag_text:
            if int(span_text.text) < 10 and int(span_text.text) >20:
                span_text.click()
                time.sleep(1)
                break
            else:
                print("None of the span on this page satisfy this condtion, span_text.text <10 and span_text.text > 20")
    except NoSuchElementException:
        driver.find_element(By.XPATH, "//*[@class='anticon anticon-right']").click()
        time.sleep(1)

更新 1:

while True:
    try:
        list_of_span_tag_text = driver.find_elements(By.XPATH, "//span[text() < 20][text() > 10]")
        for span_text in list_of_span_tag_text:
            span_text.click()
            time.sleep(1)
            break
        else:
            print("None of the span on this page satisfy this condtion, span_text.text < and span_text.text > 20")
    except NoSuchElementException:
        driver.find_element(By.XPATH, "//*[@class='anticon anticon-right']").click()
        time.sleep(1)

【讨论】:

  • 我收到以下代码错误:发生异常:ValueError invalid literal for int() with base 10: '0xb36a...d940'
  • 得到以下错误:发生异常:AttributeError 'list' object has no attribute 'click'
  • 我的循环实际上被破坏了......即使找到 span,循环也会继续......
【解决方案3】:

您可以尝试: 而1:

   len_click = 0 #remains 0 if no spans are in range 10-20
       try:
           #contains all the span with number in range.
           lst = driver.find_element(By.XPATH, "//span[number()>10][number()<20]") 
           len_click = len(lst)
           if(click!=0): #shows no span exist in range 10 to  20.
               lst[0].click
           else:
               #code for next page.
       except NoSuchElementException:
           #code for next page.    
     

如果您遇到任何问题,请在下方评论。

【讨论】:

  • 您好,感谢您的回答。我只是在我的初始代码中添加了更多行。不知道如何在这里申请。
  • 一个好的答案将始终包括解释为什么这会解决问题,以便 OP 和任何未来的读者可以从中学习。
  • 谢谢您的建议。我会添加 cmets。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-29
  • 1970-01-01
  • 2010-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多