не удается щелкнуть по элементу Python Selenium

#python-3.x #selenium #selenium-webdriver

#python-3.x #selenium #selenium-webdriver

Вопрос:

я не могу щелкнуть по элементу. Код, не позволяющий мне увидеть исключение, переходящее в блок Except. В блоке Except также первые 2 строки после управления потоком собираются для c в диапазоне (sheet.ncols): для r в диапазоне (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:UsersusernamePycharmProjectsPythonWebScrapingBook2.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):
  

Кто-нибудь может мне помочь, спасибо.

Комментарии:

1. Можете ли вы загрузить полный текст ошибки, которую вы получаете? Я немного запутался, в чем именно проблема. Кроме того, поскольку у вас возникла проблема с вашим XPath, не могли бы вы загрузить HTML или ссылку на URL? Наконец, где driver определено? Например, если вы используете Chrome, вам необходимо определить драйвер следующим образом: driver = webdriver.Chrome(executable_path="/path/to/binary/chromedriver");

2. При повторной проверке я запутался в том, что вы пытаетесь сделать. Где вы открываете браузер в первую очередь? Функции Selenium, такие как поиск объектов с помощью XPath, должны быть открыты в веб-браузере, поскольку это единственное, с чем selenium может взаимодействовать.

3. В верхней части path есть некоторый код, которым я не могу поделиться

4. В любом случае, я не думаю, что будет возможно отладить ваш XPath без полного HTML или URL страницы (ов). Наконец, не могли бы вы вставить полный текст ошибок, которые вы получаете?

5. Не получено никакой ошибки. Процесс завершен с кодом выхода 0

Ответ №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:UserstmouPycharmProjectsPythonWebScrapingchromedriver.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:UserstmouPycharmProjectsPythonWebScrapingBook2.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()
  

Комментарии:

1. Я запутался в том, где определить функцию check_exists_by_xpath (xpath). поэтому я также публикую свою первую половину кода.

2. из selenium импортируйте webdriver время импорта из selenium.common.exceptions импортируйте NoSuchElementException импортируйте xlrd driver=webdriver. Chrome(r’C:UserstmouPycharmProjectsPythonWebScrapingchromedriver.exe ‘) driver.maximize_window() driver.get(‘ xyz.comt/st/st_main.php ‘ ) driver.switch_to.frame(‘ST_mainFrame’) Элемент электронной почты = driver.find_element_by_xpath(‘//*[@id=»log_main»]/input’) Элемент электронной почты.send_keys(‘xshdfg@xyz.com ‘)

3. 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’).нажмите() driver.switch_to. parent_frame() драйвер.switch_to.frame(‘верхний фрейм’) драйвер.find_element_by_css_selector(‘.меню > ul: n-й дочерний элемент (1) > li:n-й дочерний элемент(7) > a:n-й дочерний элемент(1) > span:n-й дочерний элемент(1)’).click()#Сообщает драйвер.switch_to.parent_frame() драйвер.switch_to.frame(‘ST_mainFrame’)

4. driver.find_element_by_css_selector(‘div.menu_row:n-й дочерний элемент(16) > span: n-й дочерний элемент(3) > label:n-й дочерний элемент(2)’).click() #FTO driver.switch_to.frame(‘fto_details’) driver.find_element_by_css_selector(‘html body table tbody tr td form table tbody tr td a img’).нажмите ( )#поиск

5. Это должно сработать, если вы определите его прямо над if check_exists_by_xpath(xpath2) . Вам понадобится оператор import в верхней части файла вместе с другими. Не могли бы вы, пожалуйста, добавить этот код к вашему вопросу? Это действительно трудно прочитать в комментариях, подобных этому.

Ответ №2:

Похоже, ваша текущая проблема заключается просто в том, что вы пытаетесь преобразовать строку с буквенными символами в значение с плавающей точкой, для которого потребуются строго числовые значения. Какие бы данные ни были на вашем листе Excel, они не могут быть преобразованы в число.

Комментарии:

1. Excel содержит значения типа: 1615525 1652273 4C17461624 1649059 Xapth: xpath = «//input[@value=’Analyze’ и содержит(@onclick,'» st_string «‘)]» будут принимать только строки, поэтому я пытаюсь преобразовать их в строку.

2. Если вы просто хотите преобразовать их в строку, почему бы вам просто не использовать st_string = str(st)?

3. Я думаю, что в одном месте вы это делаете, но у вас также есть ‘st == float (st)’ в строке 53, что, я полагаю, вызывает вашу текущую ошибку.

4. Да, поскольку значения Excel являются целыми числами и строками, когда мы используем этот Excel в вашем коде, ЦЕЛЫЕ числа будут обрабатываться как значения с плавающей запятой, поэтому я пытаюсь преобразовать их в INT, а затем в STR . Напрямую я конвертирую в СТРОКИ, но в конце будет .0, чего я не хочу.

5. #C.Пек Попросил вас проверить это сейчас.