【问题标题】:Why no elements can be tergeted on this website?为什么这个网站上没有任何元素?
【发布时间】:2019-05-26 22:58:04
【问题描述】:

我正在尝试使用 selenium 在输入框中输入数据。但我无法获得任何元素(NoSuchElementException)。问题仅在于这个site

我尝试按名称/ID 搜索,但失败了。

WebDriver driver = new FirefoxDriver();        
driver.get("https://ekrs.ms.gov.pl/web/wyszukiwarka-krs/strona-glowna");
System.out.println(driver.getCurrentUrl());
System.out.println("Successfully opened the website");
WebElement wb = driver.findElement(By.id("rejestrPrzedsiebiorcy"));

我的目标(目前)只是获得这个元素:P。

【问题讨论】:

标签: java selenium web selenium-webdriver


【解决方案1】:

问题是表单通过<iframe> 元素包含在源中。你可以看到它有属性src="https://ekrs.ms.gov.pl/krsrdf/krs/wyszukiwaniepodmiotu?"。如果您转到该链接,您将看到独立的表格。问题是 - 如何访问包含的源?这很简单;)

  1. 找到<iframe> 元素:

    WebElement frame = driver.findElement(By.xpath("//div[@class='portlet-body']/div/iframe"))

  2. 切换到该帧:

    driver.switchTo().frame(frame)

就是这样!现在您位于<iframe> 元素上下文中,您可以在其中进行搜索。所以这现在可以工作了:

WebElement wb = driver.findElement(By.id("rejestrPrzedsiebiorcy"));

要切换回来(退出框架上下文),您只需调用:

driver.switchTo().defaultContent();

请注意,此站点已动态生成 id 以防止自动化,并使用 CaptchaV3(您可以看到我使用 xpath 表达式来查找 iframe)。如果您不小心,硒很容易被检测到。

【讨论】:

  • 成功了。谢谢老兄:D。还有一件事。当我按下 SearchButton(“Szukaj”)时,它会弹出一个窗口“请输入正确的代码”。你知道可能是什么原因吗?
  • @KonstantyMaciejLachowicz 您可能需要填写Numer KRS: 输入或其他内容。我不知道内部逻辑。编辑测试,不工作。
  • 我认为 ReCaptcha 会阻止 selenium 操作。例如,如果您使用element.click(),selenium 会将光标“传送”到该元素。它被检测到,并且该站点阻止您使用它。看看org.openqa.selenium.interactions.Actions。你需要“减慢硒”。但这只是猜测。这可能是不可能的或真的很难。
  • 没关系,ReCaptcha 只是检测你是否在使用 WebDriver,所以没有救命之恩。
  • 致任何感兴趣的人:我在点击“搜索”按钮之前通过清除缓存和 cookie 来避开 ReCaptcha。
【解决方案2】:

检查所需元素后仔细观察 HTML 代码。如果您的元素在<iframe> 内,那么您需要先切换到框架,然后再找到该元素。

下面是切换到frame的方法:

driver.switchTo().frame() 方法采用三个可能的参数之一:

一个数字。

通过(从零开始的)索引选择帧。也就是说,如果一个页面有三个框架,第一个框架将在索引 0 处,第二个框架在索引 1 处,第三个在索引 2 处。一旦选择了框架,WebDriver 接口上的所有后续调用都会对该框架进行.

driver.switchTo().frame(0)

名称或 ID。

按名称或 ID 选择框架。通过匹配名称属性定位的帧始终优先于通过 ID 匹配的帧。

driver.switchTo().frame("name here");

以前发现的 WebElement。

使用之前定位的 WebElement 选择一个框架。

    WebElement iframeElement = driver.findElement(By.id("IF1"));

    //now use the switch command
    driver.switchTo().frame(iframeElement);

【讨论】:

    【解决方案3】:

    先尝试driver.findElement(By.id("form-main"));,然后再尝试driver.findElement(By.id("rejestrPrzedsiebiorcy"));

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-03
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      • 2019-07-20
      • 2021-12-25
      相关资源
      最近更新 更多