我有一个按钮搜索,它将显示“未找到结果”或“另一个购买按钮”。
我想做的是创建一个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
答案 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 ,并且可以使用以下基于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()
答案 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()