如何检查元素h2是否包含文本

时间:2019-12-25 11:19:43

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

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

我想做的是创建一个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

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

文本为未找到结果的元素仅在搜索失败后出现。因此,要查找元素,您需要为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()

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您可以获取元素列表,并检查元素的大小是否大于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()