Python Селен - Как нажать на элемент, который не является кнопкой - PullRequest
0 голосов
/ 10 февраля 2020

Я использую селен в python и пытаюсь щелкнуть элемент, который не является классом кнопки. Я использую Google Chrome в качестве браузера / веб-драйвера

Вот мой код:

from selenium import webdriver
from bs4 import BeautifulSoup

driver = webdriver.Chrome(executable_path="/Users/ep9k/Desktop/SeleniumTest/drivers/chromedriver")

driver.get('http://tax.watgov.org/WataugaNC/search/commonsearch.aspx?mode=address')
driver.find_element_by_name('btAgree').click()             #clicks 'Agree' button to agree to site's terms                                            

driver.find_element_by_name('inpNumber').send_keys('190')
driver.find_element_by_name('inpStreet').send_keys('ELI HARTLEY')
driver.find_element_by_name('btSearch').click()

Это приведет меня на эту страницу: enter image description here

Я могу разобрать результаты HTML (например, с Beautiful Soup), но я хочу нажать на них. Если я осматриваю первый ряд элементов, я вижу, что он хранится в элементе div со стилем «margin-left: 3px;».

Но это не элемент кнопки, поэтому обычная функция click () не работает. Есть ли способ нажать на это? Например, если я нажму на первую строку результатов, я попаду на эту страницу с дополнительной информацией (что я действительно хочу):

enter image description here

Ответы [ 3 ]

3 голосов
/ 10 февраля 2020

Элемент не должен быть кнопкой для нажатия.

после того, как я запустил ваш код, я добавил:

results = driver.find_elements_by_class_name('SearchResults')
first_result = results[0]
first_result.click()

И он отлично работал для меня .

Скорее всего, вы пытались нажать на какой-то другой элемент, и поэтому он не работал

РЕДАКТИРОВАТЬ: Просто чтобы быть более точным, скорее всего вы пытались нажать на элемент div внутри <tr> тег. в то время как тег <tr> содержит javascript:selectSearchRow('../Datalets/Datalet.aspx?sIndex=1&idx=1'), поэтому ваш сценарий должен щелкнуть этот тег, а не <div>

1 голос
/ 10 февраля 2020

вызывает WebDriverWait и следующий css селектор, чтобы щелкнуть элемент таблицы.

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup
driver = webdriver.Chrome(executable_path="/Users/ep9k/Desktop/SeleniumTest/drivers/chromedriver")
driver.get('http://tax.watgov.org/WataugaNC/search/commonsearch.aspx?mode=address')
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.NAME,"btAgree"))).click()
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.NAME,"inpNumber"))).send_keys('190')
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.NAME,"inpStreet"))).send_keys('ELI HARTLEY')
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.NAME,"btSearch"))).click()
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.CSS_SELECTOR,"tr.SearchResults"))).click()

Снимок браузера:

enter image description here

1 голос
/ 10 февраля 2020

Нажатие на первый ряд с xpath - см. Ниже. Предполагая, что вы хотите проанализировать каждый из результатов (посылок) после этого, используйте кнопки навигации; Вы можете использовать эту структуру:

table = driver.find_elements_by_xpath("//table[@id='searchResults']")
table[0].click()

#  Extract the total number of parcels from string e.g. "1 of 24"
string=driver.find_element_by_xpath("//input[@name='DTLNavigator$txtFromTo']").get_attribute('value')
#  split string in separate words; last word i.e. [-1] is the total number of parcels e.g. "24"
total_parcels=string.split(' ')[-1]

for record in range(int(total_parcels)):
    # >>> parse record here <<<
    driver.find_element_by_xpath("//input[@name='DTLNavigator$imageNext']").click()
    time.sleep(0.5) # be considerate to your source and don't load their server with numerous quick requests
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...