【问题标题】:Using Selenium to close a browser pop-up使用 Selenium 关闭浏览器弹出窗口
【发布时间】:2019-06-30 13:31:55
【问题描述】:

我正在从网站 (Investing.com) 抓取一些数据,偶尔会弹出一个窗口。我在元素中寻找了一个可点击的按钮,但找不到任何东西。

这是来自元素页面的片段,其中 元素是我能找到的与要关闭的“X”相关的所有内容。

...
<div class="right">
    <i class="popupCloseIcon largeBannerCloser">
        ::after
    </i>
...

我试过的代码如下:

from selenium.webdriver import ChromeOptions as Options
import selenium.webdriver as webdriver

chrome_options = Options()
#chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')

d = webdriver.Chrome('chromedriver', options=chrome_options)
d.get("https://www.investing.com/currencies/eur-usd-technical")

iElements = d.find_elements_by_tag_name("i")
for name in iElements:
    print(name.get_attribute("class"))
    if name.get_attribute("class") == "popupCloseIcon largeBannerCloser":
        print("im here")
        name.click()

我打印我的文本并到达那里,所以知道我找到了我的元素,但最终出现以下错误:

selenium.common.exceptions.ElementNotInteractableException:消息: 元素不可交互

找不到其他可以互动的东西吗?

【问题讨论】:

  • 发现这个有点远,不知道它是否有帮助?

标签: javascript python selenium web-scraping beautifulsoup


【解决方案1】:

您确定这不是警报吗? 一种检查方法是尝试检查警报窗口中的元素。

您可以尝试以下任何一种:

driver.switchTo().alert().dismiss();
driver.switchTo().alert().accept();

如果这引发 NoAlertPresentException,弹出窗口的屏幕截图可能会帮助我们更好地帮助您。

【讨论】:

  • 不得不重新输入:d.switch_to.alert.dismiss() 错误如下:selenium.common.exceptions.NoAlertPresentException: Message: no such alert 这是在我的打印语句找到它之后。
  • 很遗憾没有发布截图的权限。 i.imgur.com/UltYjQP.png
  • 在图像中,有一个弹出面板和一个在背景中变灰的警报。由于 Selenium 抛出了 NoAlertPresentException,我认为我们需要先关闭弹出窗口。 您能确保这里有几件事吗: 1. 您唯一标识了正确的元素。当您为元素键入正确的 xPath 或 CssSelector 时,当您将鼠标悬停在 Searched 元素上时,它应该突出显示。 2. 在 Selenium 实际单击它之前,已定位的元素已显示并可单击。 [使用显式等待,例如“WebDriverWait”] 3. 尝试使用 JavaScriptExecutor 点击定位的元素。
【解决方案2】:

发现我可以通过删除包含所有横幅的 div 元素来绕过这个问题。通过它的 CSS 选择器设法找到它,然后使用一些 Javascript(复制/粘贴)将其删除。

这允许我的点击注册,以便我可以根据需要获取我的元素。

下面的代码尝试等待弹出窗口 5 秒钟,在这种情况下它会删除元素,否则它会继续尝试点击。

delay = 5
try:
    myElem = WebDriverWait(d, delay).until(EC.presence_of_element_located(
        (By.CSS_SELECTOR, 'body > div.generalOverlay.js-general-overlay.displayNone.js-promotional')))
    element = d.find_element_by_css_selector('body > div.generalOverlay.js-general-overlay.displayNone.js-promotional')
    d.execute_script("var element = arguments[0];element.parentNode.removeChild(element);", element)
    print("Pop-Up Negated")
except TimeoutException:
    print("No Pop-Up Detected")
aElements = d.find_elements_by_tag_name("a")
for name in aElements:
    if name.get_attribute("href") is not None and "javascript:void" in name.get_attribute("href"):
        if (name.text == i):
            print(name.text)
            name.click()
            break

任何有关改进的 cmet 将不胜感激。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    • 2017-11-01
    相关资源
    最近更新 更多