如何点击Link被其他元素覆盖? Python 3.6 和硒
How to Click Link Being Covered by Another Element? Python 3.6 and Selenium
无法弄清楚如何单击此页面 table 底部的“下一步”按钮:
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
选择按钮,但仍然没有成功。我已经 运行 在一些网站上对此进行了研究。有什么想法吗?
如果您必须单击的元素有父元素,那么您可以通过 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();
});
});
To click()
在文本为 Next 的元素上,您必须为 引入 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
另一种方法,如果您不想在代码中添加额外的等待,只需单击按钮:
使用 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)
更新:
我之前没有注意到这一点,但是
element = driver.find_element_by_xpath('//*[@id="industry_rank_table_next"]')
driver.execute_script("arguments[0].click();", element)
...在成功点击 link 时工作,但给了我
selenium.common.exceptions.WebDriverException: Message: unknown error: call function result missing 'value'
...单击 link 后出错。所以为了解决这个问题,我刚刚添加了一个 try/except 来处理错误。即:
try:
element = driver.find_element_by_xpath('//*[@id="industry_rank_table_next"]')
driver.execute_script("arguments[0].click();", element)
except:
pass
...这似乎有效。对我而言,这似乎是一个愚蠢的观察,但感谢大家的帮助。希望这里的内容能在将来对其他人有所帮助。
无法弄清楚如何单击此页面 table 底部的“下一步”按钮:
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
选择按钮,但仍然没有成功。我已经 运行 在一些网站上对此进行了研究。有什么想法吗?
如果您必须单击的元素有父元素,那么您可以通过 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();
});
});
To click()
在文本为 Next 的元素上,您必须为 引入 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
另一种方法,如果您不想在代码中添加额外的等待,只需单击按钮:
使用 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)
更新:
我之前没有注意到这一点,但是
element = driver.find_element_by_xpath('//*[@id="industry_rank_table_next"]')
driver.execute_script("arguments[0].click();", element)
...在成功点击 link 时工作,但给了我
selenium.common.exceptions.WebDriverException: Message: unknown error: call function result missing 'value'
...单击 link 后出错。所以为了解决这个问题,我刚刚添加了一个 try/except 来处理错误。即:
try:
element = driver.find_element_by_xpath('//*[@id="industry_rank_table_next"]')
driver.execute_script("arguments[0].click();", element)
except:
pass
...这似乎有效。对我而言,这似乎是一个愚蠢的观察,但感谢大家的帮助。希望这里的内容能在将来对其他人有所帮助。