Учитывая ваш последний комментарий, кажется, что второе окно (по крайней мере) не будет содержать по крайней мере одно из "//*[@id='create_button']"
или "//*[@id='update_button']"
. В таком случае, в следующем блоке кода,
if driver.find_element_by_xpath(xpath2):
driver.find_element_by_xpath(xpath2).click()
driver.close()
elif driver.find_element_by_xpath(xpath3):
driver.find_element_by_xpath(xpath3).click()
driver.close()
Как минимум один из
if driver.find_element_by_xpath(xpath2):
или
elif driver.find_element_by_xpath(xpath3):
выбросит ElementNotFoundException
отправку вас в ваш блок except
.
Это потому, что выполнение driver.find_element_by_xpath()
выдает такую ошибку каждый раз, когда элемент не находится.
Я не уверен, что вы пытаетесь выполнить или как выглядят ваши страницы, поэтому я не знаю, что исправить, но, похоже, это является причиной вашей проблемы. Если вы можете предоставить более подробную информацию о том, что именно вы пытаетесь сделать с помощью этого цикла, я мог бы предложить исправление.
Если подумать, может сработать следующее:
Добавьте этот импорт и работайте где-нибудь:
from selenium.common.exceptions import NoSuchElementException
def check_exists_by_xpath(xpath):
try:
webdriver.find_element_by_xpath(xpath)
except NoSuchElementException:
return False
return True
Затем измените исходный блок if на:
if check_exists_by_xpath(xpath2):
driver.find_element_by_xpath(xpath2).click()
driver.close()
elif check_exists_by_xpath(xpath3):
driver.find_element_by_xpath(xpath3).click()
driver.close()
РЕДАКТИРОВАТЬ Это в значительной степени то, что я думал. Это помогает?
from selenium import webdriver
import time
from selenium.common.exceptions import NoSuchElementException
import xlrd
driver = webdriver.Chrome(r'C:\Users\tmou\PycharmProjects\Python\WebScraping\chromedriver.exe')
driver.maximize_window()
driver.get('https://www.stew.cyz.com/st/st_main.php')
driver.switch_to.frame('ST_mainFrame')
emailElem = driver.find_element_by_xpath('//*[@id="log_main"]/input')
# emailElem=browser.find_element_by_id('log_main')
# emailElem=browser.find_element_by_name("hpuser_id")
emailElem.send_keys('xyn@hyo.com')
# time.sleep(5)
passwordElem = driver.find_element_by_xpath('//*[@id="log_main"]/p[1]/input')
passwordElem.send_keys('********')
passwd = passwordElem.find_element_by_xpath('//*[@id="log_main"]/p[2]/input').click()
driver.switch_to.parent_frame()
driver.switch_to.frame('topFrame')
driver.find_element_by_css_selector(
'.menu > ul:nth-child(1) > li:nth-child(7) > a:nth-child(1) > span:nth-child(1)').click() # Reports
driver.switch_to.parent_frame()
driver.switch_to.frame('ST_mainFrame')
driver.find_element_by_css_selector(
'div.menu_row:nth-child(16) > span:nth-child(3) > label:nth-child(2)').click() # FTO
driver.switch_to.frame('fto_details')
time.sleep(8)
driver.find_element_by_css_selector('html body table tbody tr td form table tbody tr td a img').click() # search
path = r'C:\Users\tmou\PycharmProjects\Python\WebScraping\Book2.xlsx'
workbook = xlrd.open_workbook(path)
sheet = workbook.sheet_by_index(0)
for c in range(sheet.ncols):
for r in range(sheet.nrows):
st = (sheet.cell_value(r, c))
try:
if st == float(st):
st_string = str(int(st))
xpath = "//input[@value='Analyze' and contains(@onclick,'" + st_string + "')]"
# cont = 0
if driver.find_elements_by_xpath(xpath):
driver.find_element_by_xpath(xpath).click() # Here new window will open
handles = driver.window_handles
h = len(handles) # h=2
# print(handles)
for handle in range(1, h):
# for handle in range(h):
driver.switch_to.window(handles[handle])
driver.find_element_by_xpath(
'/html/body/table/tbody/tr[4]/td/table/tbody/tr[9]/td[3]/input').click()
time.sleep(2)
driver.close()
lst_window = driver.window_handles
h2 = len(lst_window) # h2=3
def check_exists_by_xpath(xpath):
try:
webdriver.find_element_by_xpath(xpath)
except NoSuchElementException:
return False
return True
# for lst_handle in range(2,h2):
for lst_handle in range(1, h2):
driver.switch_to.window(lst_window[lst_handle])
xpath2 = '//*[@id="create_button"]'
xpath3 = '//*[@id="update_button"]'
if check_exists_by_xpath(xpath2):
driver.find_element_by_xpath(xpath2).click()
driver.close()
elif check_exists_by_xpath(xpath3):
driver.find_element_by_xpath(xpath3).click()
driver.close()
# cont+=1
# print(cont)
# except ValueError:
except Exception:
if st == str(st):
xpath = "//input[@value='Analyze' and contains(@onclick,'" + st + "')]"
# cont1=0
if driver.find_elements_by_xpath(xpath):
driver.find_element_by_xpath(xpath).click() # Here new window will open
handles = driver.window_handles
h = len(handles) # h=2
# print(handles)
for handle in range(1, h):
# for handle in range(h):
driver.switch_to.window(
handles[handle]) # /html/body/table/tbody/tr[4]/td/table/tbody/tr[9]/td[3]/input
driver.find_element_by_xpath(
'/html/body/table/tbody/tr[4]/td/table/tbody/tr[9]/td[3]/input').click()
# time.sleep(5)
driver.close()
lst_window = driver.window_handles
h2 = len(lst_window) # h2=2
for lst_handle in range(2, h2):
if driver.switch_to.window(lst_window[lst_handle]):
driver.find_element_by_xpath('//*[@id="create_button"]').click()
driver.close()
else:
driver.find_element_by_xpath('//*[@id="update_button"]').click()
driver.close()