Как я могу нажать на эту ссылку с селеном, используя Python? - PullRequest
0 голосов
/ 05 июля 2018

Я новичок в программировании и пытаюсь научиться автоматизировать веб-процедуры. Я работаю на основе https://www.coeweb.istat.it/.

Мне нужно найти элементы страницы, и я уже попробовал с driver.find_element_by_xpath но поскольку я не очень хорошо знаком с HTML-кодом, я даже не уверен, что использую правильный кусок кода в качестве аргумента для этого метода. Может кто-нибудь, пожалуйста, пришлите мне в качестве примера кода, чтобы перейти по ссылке qui., выделенной жирным шрифтом прямо в середине страницы, пожалуйста? Вот что я попробовал:

from selenium import webdriver
from selenium.webdriver.common.by import By
url = "https://www.coeweb.istat.it/"
driver = webdriver.Chrome()
driver.get(url)
link = driver.find_element_by_xpath('//[@id="AutoNumber1"]/tbody/tr[3]/td[2]/p[3]/font/a/strong')
link.click()

Тем не менее я получаю сообщение об ошибке:

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id="AutoNumber1"]/tbody/tr[3]/td[2]/p[3]/font/a/strong"}

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

В соответствии с URL вы поделились ссылкой с текстом как qui. с <frame>. Поэтому вам нужно переключиться на нужный кадр, вызывая WebDriverWait , а затем снова вызывать WebDriverWait , ища элемент следующим образом:

  • Кодовый блок:

    from selenium import webdriver
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
    options = webdriver.ChromeOptions() 
    options.add_argument("start-maximized")
    options.add_argument('disable-infobars')
    driver=webdriver.Chrome(chrome_options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
    url = "https://www.coeweb.istat.it/"
    driver.get(url)
    WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.NAME,"principale")))
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//table[@id='AutoNumber1']//tr//td//p//a[@href='lnkdati.htm' and .//strong[contains(.,'qui.')]]"))).click()
    
  • Снимок браузера:

www_coeweb_istat_it

0 голосов
/ 05 июля 2018

Вам нужно подождать, пока он станет кликабельным:

# I have fixed xpath
element = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.XPATH, "//*[@id='AutoNumber1']//a[contains(., 'qui.')]"))
    )
element.click()

Примечание: вам нужно сделать несколько импортов:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

Также можно использовать CSS-селектор, чтобы найти элемент:

#AutoNumber1 > tbody > tr:nth-child(3) > td:nth-child(2) > p:nth-child(3) > font > a

и

element = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.CSS_SELECTOR, "#AutoNumber1 > tbody > tr:nth-child(3) > td:nth-child(2) > p:nth-child(3) > font > a"))
    )
element.click()

РЕДАКТИРОВАТЬ: Вы должны переключиться на фрейм, прежде чем найти свой элемент следующим образом:

driver.switch_to.frame(driver.find_element_by_xpath("//frame[@name = 'principale']"))

Таким образом, полный код будет таким:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

url = "https://www.coeweb.istat.it/"
driver = webdriver.Chrome()
driver.get(url)

driver.switch_to.frame(driver.find_element_by_xpath("//frame[@name = 'principale']")) # switches to frame
element = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.XPATH, "//*[@id='AutoNumber1']//a[contains(., 'qui.')]"))
    )
element.click()
driver.switch_to.default_content() # switch back to default content

Объяснение: вы не можете взаимодействовать с элементами, которые находятся в iframe или в frame. Чтобы сделать это, вы должны найти frame, переключиться на него, сделать что-то и затем переключиться обратно на содержимое по умолчанию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...