【问题标题】:How to check if an element h2 contain a text如何检查元素h2是否包含文本
【发布时间】:2020-04-16 01:47:17
【问题描述】:

我有一个按钮搜索,它会显示“未找到结果”或“另一个购买按钮”。

我要做的是创建一个if 以检查页面上是否有“未找到结果”,单击返回按钮。如果没有,请点击购买按钮。

这是 HTML 代码:

<button> Search </button>
..
<div class="contents"> <h2>No results found<h/2> </div> #the message I want to check first
..
<button class="btn-standard> Buy Now </button> #buy button
...
<button class="back"> Back </button> #the button I want to click if no resul

我已经尝试过类似以下的方法:

if driver.find_element_by_xpath('//h2[text()="No results found"]'):
   driver.find_element_by_class_name('back').click()
else:
   WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[contains(., 'Buy Now')]"))).click()

但它没有用。我必须使用try / catch 编码吗?

另一个编辑:

我现在收到此错误。我不知道如何隐藏那个遮住我的购买按钮的元素。

ElementClickInterceptedException: Message: Element <button class="btn-standard buyButton"> is not clickable at point (1086,641) because another element <div class="ut-click-shield showing interaction"> obscures it

【问题讨论】:

    标签: python python-2.7 selenium selenium-webdriver selenium-chromedriver


    【解决方案1】:

    find_element_*如果元素不存在会抛出异常,使用find_elements_*并检查返回的列表是否为空

    wait = WebDriverWait(driver, 20)
    elements = driver.find_elements_by_xpath('//h2[text()="No results found"]')
    if elements:
        wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'back'))).click()
    else:
        wait.until(EC.element_to_be_clickable((By.XPATH, "//button[contains(., 'Buy Now')]"))).click()
    

    【讨论】:

    • 我现在收到此错误:ElementClickInterceptedException: Message: Element &lt;button class="back"&gt; is not clickable at point (128,80) because another element &lt;div class="click-shield showing interaction"&gt; obscures it
    【解决方案2】:

    你可以实现一个检查元素是否存在的方法

    public boolean checkElementExists(By by) {
        try {
            driver.findElement(by);
        } catch (NoSuchElementException e) {
            return false;
        }
        return true;
    }
    

    然后你可以把它放在 if 子句中

    if(!checkElementExists(By.xpath("//h2[text()="No results found"]")))
        click back
    

    【讨论】:

      【解决方案3】:

      可以获取元素列表,查看元素大小是否大于0,然后点击即可。
      你可以这样做:

       results = driver.find_elements_by_xpath('//h2[text()="No results found"]')
       if(len(results)>0):
           driver.find_element_by_xpath("//button[contains(text(),'Back')]").click()
       else:
           driver.find_element_by_xpath("//button[contains(text(),'Buy Now')]").click()
      

      【讨论】:

        【解决方案4】:

        文本为No results found的元素只会在搜索不成功后出现。因此,要查找您需要为element_to_be_clickable() 诱导WebDriverWait 的元素,您可以使用以下基于Locator Strategies 之一:

        try:
            WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//div[@class='contents']//h2[text()='No results found']")))
            WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[@class='back' and contains(,. 'Back')]"))).click()
        except TimeoutException:
            WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[@class='btn-standard' and contains(,. 'Buy Now')]"))).click()
        

        【讨论】:

        • 如果后退按钮不包含文本,我是否必须使用以下代码行?`WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[@class='back']"))).click()`
        • @PaulVio 是的,你是对的,但你必须确保定位器策略 (By.XPATH, "//button[@class='back']") 唯一标识所需的元素,否则你已经引用了祖先元素,就像我们在 //div[@class='contents']//h2 的情况下所做的那样跨度>
        • 是的,工作,但还有一件事,我希望它已经完成.. 你能再看看我最新的编辑吗?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-03-31
        • 1970-01-01
        • 2021-07-16
        • 2017-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多