【问题标题】:unable to click on the element Python Selenium无法点击元素 Python Selenium
【发布时间】:2019-07-10 05:29:39
【问题描述】:

无法点击该元素。代码没有让我看到异常跳转到除块。在除块中,流控制后的前 2 行也将用于 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):

谁能帮帮我,谢谢。

【问题讨论】:

  • 你能上传你得到的错误的全文吗?我有点困惑到底是什么问题。另外,由于您的 xPath 有问题,您可以上传 HTML 或链接到 URL 吗?最后,driver 定义在哪里?例如,如果您使用的是 Chrome,您需要以这种方式定义驱动程序:driver = webdriver.Chrome(executable_path="/path/to/binary/chromedriver");
  • 在第二次检查中,我对您要做什么感到困惑。你首先在哪里打开浏览器? Selenium 功能,例如通过 xPath 查找东西,需要打开一个 Web 浏览器,因为这是 selenium 唯一可以与之交互的东西。
  • 在路径顶部有一些我无法分享的代码
  • 无论如何,我认为如果没有完整的 HTML 或页面的 URL,就无法调试 xPath。最后,您能否粘贴您收到的错误的全文?
  • 没有收到任何错误。进程以退出代码 0 结束

标签: python-3.x selenium selenium-webdriver


【解决方案1】:

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

【讨论】:

  • 我对在哪里定义 check_exists_by_xpath(xpath) 函数感到困惑。所以也发布我的前半部分代码。
  • 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('xyz.comt/st/st_main.php') driver.switch_to.frame('ST_mainFrame') emailElem = driver.find_element_by_xpath('//*[@id="log_main"]/input') emailElem.send_keys( 'xshdfg@xyz.com')
  • 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驱动.switch_to.frame('fto_details') driver.find_element_by_css_selector('html body table tbody tr td form table tbody tr td a img').click()#search
  • 如果你在if check_exists_by_xpath(xpath2)上方定义它应该可以工作。您将希望文件顶部的 import 语句与其他语句一起出现。您能否将该代码添加到您的问题中?像这样的 cmets 真的很难读懂。
【解决方案2】:

看起来您当前的问题只是您试图将带有字母字符的字符串转换为需要严格数值的浮点数。您的 Excel 工作表上的任何数据都无法转换为数字。

【讨论】:

  • Excel 包含如下值:1615525 1652273 4C17461624 1649059 Xapth : xpath = "//input[@value='Analyze' and contains(@onclick,'" + st_string + "')]" 将只接受字符串,所以我试图将它们转换为字符串。
  • 如果您只想将它​​们转换为字符串,为什么不简单地使用 st_string = str(st)?
  • 我认为你有一个地方,但你在第 53 行也有“st == float(st)”,我认为这会导致你当前的错误。
  • 是的,因为当我们在您的代码中使用 Excel 时,Excel 值是整数和字符串 INTEGERS 将被视为 FLOATS 所以我尝试将它们转换为 INT 然后 STR 。我直接转换为字符串,但最后会出现 .0,这是我不想要的。
  • #C.Peck 你现在检查了吗。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-10
  • 2021-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-29
相关资源
最近更新 更多