我正在尝试使用硒在输入框中输入数据。但是我无法获取任何元素(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。
答案 0 :(得分:3)
问题在于表单是通过<iframe>
元素包含在源中的。您可以看到它具有属性src="https://ekrs.ms.gov.pl/krsrdf/krs/wyszukiwaniepodmiotu?"
。如果您转到该链接,将看到独立表格。问题是-如何访问包含的源?这很简单;)
找到<iframe>
元素:
WebElement frame = driver.findElement(By.xpath("//div[@class='portlet-body']/div/iframe"))
切换到该帧:
driver.switchTo().frame(frame)
就是这样!现在,您位于<iframe>
元素上下文中,并且可以在其中进行搜索。所以现在可以使用:
WebElement wb = driver.findElement(By.id("rejestrPrzedsiebiorcy"));
要切换回(退出框架上下文),只需调用:
driver.switchTo().defaultContent();
请注意,此站点具有动态生成的ID以防止自动化,并使用CaptchaV3(您可以看到我使用xpath表达式来查找iframe)。如果不小心,很容易检测到硒。
答案 1 :(得分:1)
检查必需的元素后,请仔细观察HTML代码。如果您的元素位于<iframe>
内,则需要先打开框,然后找到该元素。
下面是切换到框架的方法:
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);
答案 2 :(得分:0)
先尝试driver.findElement(By.id("rejestrPrzedsiebiorcy"));
,然后再尝试 services.AddMvc()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
.AddJsonOptions(x=>
{
x.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented;
});
。