Как щелкнуть ссылку, покрываемую другим элементом? Python 3.6 и Selenium - PullRequest
0 голосов
/ 15 января 2019

Не можете понять, как нажать кнопку Далее в нижней части таблицы на этой странице:

https://www.zacks.com/stocks/industry-rank/reit-and-equity-trust-other-266/stocks-in-industry

Вот что я пробовал:

from bs4 import BeautifulSoup
import requests
import csv, random, time
from pandas.io.html import read_html
from selenium import webdriver
from selenium.webdriver.support.ui import Select


url = 'https://www.zacks.com/stocks/industry-rank/reit-and-equity-trust-other-266/stocks-in-industry'

    # Open Chrome
driver = webdriver.Chrome()

    # Send Chrome to the URL
page = driver.get(url)

    # Wait for page to load a few seconds
timeDelay = random.randrange(4, 8)
time.sleep(timeDelay)

    # Try to click the darn button
element = driver.find_element_by_xpath('//*[@id="industry_rank_table_next"]')
driver.execute_script("arguments[0].click();", element)  

... и

element = driver.find_element_by_xpath('//*[@id="industry_rank_table_next"]')
element.send_keys("\n")

... нашел из других ответов, но не работает для меня. Простое использование .click() не работает. Я также попытался выбрать кнопку, используя css_selector, partial_link_text и class_name, но все еще безуспешно. Я столкнулся с этим на нескольких сайтах. Есть идеи?

Ответы [ 4 ]

0 голосов
/ 16 января 2019

UPDATE

Я не замечал этого раньше, но

element = driver.find_element_by_xpath('//*[@id="industry_rank_table_next"]')
driver.execute_script("arguments[0].click();", element)

... работает, когда она успешно нажимает на ссылку, но дает мне

selenium.common.exceptions.WebDriverException: Message: unknown error: call function result missing 'value'

... ошибка после нажатия на ссылку. Поэтому, чтобы обойти это, я просто добавил попытку / исключение для обработки ошибки. то есть:

try:
    element = driver.find_element_by_xpath('//*[@id="industry_rank_table_next"]')
    driver.execute_script("arguments[0].click();", element)
except:
    pass

... который, кажется, работает. С моей стороны это выглядит как глупое наблюдение, но спасибо всем за помощь. Надеюсь, что-то здесь поможет кому-то еще в будущем.

0 голосов
/ 15 января 2019

К click() на элементе с текстом Далее необходимо заставить WebDriverWait для элемента быть активным , и вы можете использовать любой из следующие решения:

  • Использование LINK_TEXT:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.LINK_TEXT, "Next"))).click()
    
  • Использование CSS_SELECTOR:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a.paginate_button next#industry_rank_table_next"))).click()
    
  • Использование XPATH:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[@class='paginate_button next' and @id='industry_rank_table_next']"))).click()
    
  • Примечание : Вы должны добавить следующий импорт:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
0 голосов
/ 15 января 2019

Другой способ, если вы не хотите добавлять дополнительные ожидания к вашему коду и просто нажмите кнопку:

используя JavaScript клик:

element = driver.find_element_by_xpath("//a[@class='paginate_button next' and @id='industry_rank_table_next']")
driver.execute_script("arguments[0].click();", element)
0 голосов
/ 15 января 2019

если элемент, по которому нужно щелкнуть, имеет родительский элемент, то вы можете найти родителя методом findElements, после чего вам просто нужно передать индекс элемента, например 0 или 1 или около того, и затем вы можете выполнить щелчок действие на это

Want to click on third li from second ul:

   <ul id="select-123" style="width: 1180px; display: none;">
   <li class="" style="display:none;">
   <li class="">
   <li class="">
   <li class="">
   </ul>

   <ul id="select-123" style="width: 1180px; display: none;">
   <li class="" style="display:none;">
   <li class="">
   <li class="">
   <li class="">
   </ul>


Code I am trying is to select third li from second ul which does not work:

    driver.findElements(By.css(ul[id*='select-123'])).then(function(elems) {
    elems[2].then(function(lis) {
    driver.findElement(By.css("ul[id*='select-123'] li:nth-child(3)")).click();
    });
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...