我有一个按钮搜索,它将显示“未找到结果”或“另一个购买按钮”。
我想做的是创建一个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
文本为未找到结果的元素仅在搜索失败后才会出现。因此,要查找元素,您需要为element_to_be_clickable()
引入WebDriverWait,并且可以使用以下基于xpath的任何一个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()
您可以实现一种检查元素是否存在的方法
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
[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()
您可以获取元素列表,并检查元素的大小是否大于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()