gpt4 book ai didi

python-3.x - 无法点击元素 Python Selenium

转载 作者:行者123 更新时间:2023-12-03 09:49:46 26 4
gpt4 key购买 nike

无法点击该元素。没有让我看到Exception跳转到Except Block的代码。在 Except block 中,流量控制将转到 for c in range(sheet.ncols) 之后的前两行: for r in range(sheet.nrows):此处无法找到或单击 xpath。代码输出是进程结束,退出代码为 0

from selenium import webdriver
import time

from selenium.common.exceptions import NoSuchElementException
import xlrd
driver = webdriver.Chrome(r'chromedriver.exe')
driver.maximize_window()
driver.get('url')
driver.switch_to.frame('m')
emailElem = driver.find_element_by_xpath('//*[@id="log_main"]/input')

# emailElem=browser.find_element_by_id('l')
# emailElem=browser.find_element_by_name("id")
emailElem.send_keys('sf@df.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\username\PycharmProjects\Python\WebScraping\Book2.xlsx'
workbook = xlrd.open_workbook(path)
sheet = workbook.sheet_by_index(0)


"""def check_exists_by_xpath(xpath):
try:
driver.find_element_by_xpath(xpath)
except NoSuchElementException:
return False

return True
"""
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()
driver.find_element_by_css_selector('.t2').click()
#time.sleep(2)
#driver.close()

lst_window = driver.window_handles
h2 = len(lst_window) #h2=2
def check_exists_by_xpath(xpath):
try:
driver.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']"
#css2 = '#create_button'
#css3 = '#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()

#if driver.find_element_by_css_selector(css2):
# driver.find_element_by_css_selector(css2).click()
#elif driver.find_element_by_css_selector(css3):
# driver.find_element_by_css_selector(css3).click()

#if driver.find_element_by_xpath(xpath2) or driver.find_element_by_xpath(xpath3):
# driver.find_element_by_xpath(xpath2 or xpath3).click()
# driver.close()
#elif driver.find_element_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])
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
def check_exists_by_xpath(xpath):
try:
driver.find_element_by_xpath(xpath)
except NoSuchElementException:
return False
return True
#for lst_handle in range(1, h2):
for lst_handle in range(2,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()


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

我的代码有什么问题。在 excel 中,我有 n 个值(行),因为只有第一个值代码才能成功执行。其余的值正在上升,但是

xpath = "//input[@value='Analyze' and contains(@onclick,'" + st_string + "')]"
#cont = 0
if driver.find_elements_by_xpath(xpath):

在这段代码之后,控件移回 Excel(for 循环),一段时间后它抛出 ValueError。

except Exception:
if st == str(st):
xpath = "//input[@value='Analyze' and contains(@onclick,'" + st + "')]"
#cont1=0

这里抛出异常

Traceback (most recent call last): File "m.py", line 53, in <module> if st == float(st): ValueError: could not convert string to float: '23' During handling of the above exception, another exception occurred: Traceback (most recent call last):

谁能帮帮我,谢谢。

最佳答案

鉴于您的最新评论,似乎第二个窗口(至少)不会包含至少一个 "//*[@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 block 。

这是因为执行 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 block 更改为:

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

关于python-3.x - 无法点击元素 Python Selenium,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55108920/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com